从子视图访问属性到 ViewController Swift
Posted
技术标签:
【中文标题】从子视图访问属性到 ViewController Swift【英文标题】:Access properties from subview to ViewController Swift 【发布时间】:2016-12-11 16:35:11 【问题描述】:如何将子视图的属性访问到视图控制器。
示例:如果我有一个@IBOutlet 弱变量 loginBtn:UIButton!我怎样才能访问我的视图控制器?我做了很多关于如何做到这一点的事情和教程,但我仍然没有设法让它发挥作用。
而且我也很困惑加载 xib 的最佳方式是什么?我在教程中看到了很多方法,但我也想知道他们在生产应用程序中是如何做到的。
protocol UserLoginDelegate
func userDidLogin(status: Bool, message: String)
@IBDesignable class LoginWidget: UIView
var loginDelegate: UserLoginDelegate?
var loginView: UIView!
var nibName: String = "LoginWidget"
let defaults = NSUserDefaults.standardUserDefaults()
@IBOutlet weak var loginButton: UIButton!
@IBOutlet weak var email: UITextField!
@IBOutlet weak var password: UITextField!
@IBOutlet weak var name: UITextField!
@IBAction func loginBtn(sender: AnyObject)
// init
override init(frame: CGRect)
super.init(frame: frame)
// set anything that uses the view or visible bounds
setup()
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
// setup
setup()
func setup()
loginView = loadViewFromNib()
loginView.frame = bounds
loginView.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
addSubview(loginView)
func loadViewFromNib() -> UIView
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: nibName, bundle: bundle)
let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
return view
控制器
class AuthenticationViewController: UIViewController, UserLoginDelegate
override func viewDidLoad()
super.viewDidLoad()
loginWidget = LoginWidget(frame: CGRect(x: 0, y: 171, width: 375, height: 247))
authenticationSegment.setEnabled(true, forSegmentAtIndex: 0)
loginWidget.loginDelegate = self
self.view.addSubview(loginWidget)
// Do any additional setup after loading the view.
【问题讨论】:
一个不相关的问题太多了。 【参考方案1】:首先,关于 SO:这里的目标是拥有一个遵循某种模式的众包知识库(一个本体!)。普通用户喜欢以下形式的问题:
我对此感到困惑。我想完成这个非常具体的事情。这是我尝试过的代码。我认为这是问题所在。你能告诉我如何正确地做到这一点或让它发挥作用吗?
因此,最终我们会得到一长串带有直接解决方案的索引可搜索问题。这类空洞的、不具体的、多问题的、令人困惑的帖子往往会被否决、被忽视、被告知要改写等等。
我会解决你的问题:
如果我有一个@IBOutlet 弱变量 loginBtn: UIButton!我怎样才能访问 到我的视图控制器?我做了很多事情和教程 这样做,但我还是没能成功。
使用 UIButton 或任何 UIControl 子类,您可以将 @IBAction 拖到您的视图控制器中。通过 ctrl 从相关故事板按钮拖动到您的代码(与您制作插座的方式相同)并从下拉菜单中选择操作来完成此操作。然后您可以选择更改发送此操作的对象的类型(它是 UIButton,还是任何人都可以调用此方法,它恰好链接到按钮),或者您可以更改它被调用的控件事件(即是当他们在按钮上触摸 DOWN 时还是在手指仍在按钮内触摸时向上触摸时,这一秒是默认值。)
更一般地说,如果你有一个不是控件的复杂视图,你总是可以向它添加一个手势识别器(即 UITapGestureRecognizer)并从中拖动一个 IBAction,(将手势识别器拖到视图上,然后从在左窗格中,从手势记录 ctrl 拖动到您的代码并再次选择操作)。
最后,这比您目前需要的要多,但是如果您有一个必须通知视图控制器某些事情的视图,或者告诉视图控制器(或任何对象)执行诸如“请向我发送数据”之类的操作,您可以使用委托模式。简单地说:您定义一个协议来列出协议所需的方法和变量。您可以通过为每个方法提供一个实现来使您的委托对象符合此协议,然后在您的视图中放置一个变量,例如
weak var delegate: MyProtocol?
委托模式在 Swift 中很重要,您可能应该阅读它。例如,如果您使用过表格视图,您可能已经使用过它。
而且我也很困惑加载 xib 的最佳方式是什么?有很多 我在教程中看到的方式,但我也想知道他们是如何做到的 生产应用程序。
以下是我如何启动作为 xib 文件所有者的每个视图。我相信这是正确的方法,如果这是错误的,将不胜感激。这是 swift 3,你现在应该使用它.. 它好多了!
@IBOutlet var mainView: UIView!
// the above is the outlet from the xib's main view. which I always call main view
override init(frame: CGRect)
super.init(frame: frame)
combinedInit()
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
combinedInit()
func combinedInit()
Bundle.main.loadNibNamed("XibFileName", owner: self, options: nil)
addSubview(mainView)
mainView.frame = self.bounds
// more initialization stuff
【讨论】:
以上是关于从子视图访问属性到 ViewController Swift的主要内容,如果未能解决你的问题,请参考以下文章