如何在SwiftUI中分配可选的Binding参数?

时间:2019-07-23 11:22:33

标签: swift binding swiftui

我正在尝试使用一些可选的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 ....

}

我要谈论的属性是searchIsOnsearchTxt。 但是执行赋值self._searchTxt = searchTxtself._searchIsOn = searchIsOn会引发编译错误:

  

无法分配类型为“绑定”的值?键入“绑定”

您知道如何解决此问题吗?

还是有更好的方法来做我想做的事情?

4 个答案:

答案 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语句几乎是伪代码,因为我实际上使用的是CIImagefrom 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))
    }
    }