我正在尝试使用一些可选的NavBar
构建自定义Views
,例如搜索栏(但仅当视图需要显示它时)。
基本上,我需要将@State
的一些@Binding
属性传递给视图。但是我还需要将它们作为Optional
参数。
这是一个例子:
struct NavBar: View {
var isSearchable: Bool?;
@Binding var searchTxt: String;
@Binding var searchIsOn: Bool;
var navBarTitle: String;
var navBarAction: (() -> Void)?;
var navBarImage: String?;
init(navBarTitle: String, navBarAction: (() -> Void)? = nil, navBarImage: String? = nil, isSearchable: Bool? = false, searchTxt: (Binding<String>)?, searchIsOn : (Binding<Bool>)?) {
self.navBarTitle = navBarTitle;
if(navBarAction != nil) {
self.navBarAction = navBarAction!;
}
if(navBarImage != nil) {
self.navBarImage = navBarImage!;
}
self.isSearchable = isSearchable;
self._searchTxt = (searchTxt != nil) ? (searchTxt!).binding : nil;
self._searchIsOn = (searchIsOn != nil) ? (searchIsOn!).binding : nil;
assert((navBarAction != nil) ? navBarImage != nil : true);
assert((isSearchable! == true) ? (searchTxt!.value.count > 0) : true);
}
// var body ....
}
我要谈论的属性是searchIsOn
和searchTxt
。
但是执行赋值self._searchTxt = searchTxt
或self._searchIsOn = searchIsOn
会引发编译错误:
无法分配类型为“绑定”的值?键入“绑定”
您知道如何解决此问题吗?
还是有更好的方法来做我想做的事情?
答案 0 :(得分:25)
@Binding var searchTxt: String?
init(searchTxt: Binding<String?>?) {
self._searchTxt = searchTxt ?? Binding.constant(nil)
}
答案 1 :(得分:7)
您想要的是一个字符串的可选绑定,而不是一个可选字符串的绑定。我认为您无法通过使用@Binding注解来实现这一目标。
但是,您不需要使用注释。您只需将变量声明为Binding:
您的
@Binding var searchTxt: String?;
然后转向这个
var searchTxt: Binding<String?>
但是通过这种语法,您可以放置??哪里都行。因此,如果将其移动到末尾,则在Binding的结束标记之后,您将拥有所需的内容。
var searchTxt: Binding<String>?
如果要访问绑定内部的String,则必须使用wrapdValue属性。
Text(searchTxt!.wrappedValue)
答案 2 :(得分:1)
我有一个UIImagePickerController
,以便使用ContentView
。如果您曾经使用过此图像选择器,则知道需要将图像返回为可选图像。因此,我在@State var uiImage: UIImage?
...
if uiImage != nil {
Image(uiImage: $uiImage
} else {
Rectangle()
}
中声明:
ImagePicker
在我的SwiftUI
(这是我的@Binding var uiImage: UIImage?
视图)中,我有:
if
像魅力一样工作。
(MTKView
语句几乎是伪代码,因为我实际上使用的是CIImage
和from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
binary = r'C:\Program Files\Mozilla Firefox\firefox.exe' #this should be same if using windows
options = Options()
options.set_headless(headless=True)
options.binary = binary
cap = DesiredCapabilities().FIREFOX
cap["marionette"] = True #optional
driver = webdriver.Firefox(firefox_options=options, capabilities=cap, executable_path=r'Your Path') #put your geckodriver path here
#Above code should be the same for most of the time when you scrape.
#Below is the place where you will be making changes
instagram_url = "https://www.instagram.com"
username = "jlo"
profile = instagram_url + "/" + username
driver.get(profile)
soup=BeautifulSoup(driver.page_source)
for x in soup.findAll('h1',{'class':'rhpdm'}):
print(x.text.strip())
driver.quit()
,但您会遇到麻烦-您像你会在其他任何地方。)
答案 3 :(得分:0)
下面是使用可选绑定的示例,以及如何访问绑定并切换以显示某些视图的示例:
struct NavBar: View {
@Binding var showUser: Bool
var showOptional: Binding<Bool>?
var body: some View {
VStack {
Button(action: { showUser.toggle() },
label: { Text("NOT OPTIONAL") })
Button(action: { showSelectBuddy?.wrappedValue.toggle()) },
label: { Text("NOT OPTIONAL") })
}
}
}
struct UseNavbar: View {
@State var showoptional = false
@State var show = false
var body: some View {
Text("Optional")
.navigationBarItems(leading:
NavBar(showUser: show), trailing: NavBar(showUser: show, showOptional: showoptional))
}
}