【发布时间】:2015-03-03 08:30:25
【问题描述】:
我正忙着制作带有帐户页面的应用程序。我希望用户可以通过该页面登录,并且一旦他们成功登录,页面就会重新加载以显示他们的帐户信息,而不是说明他们必须登录才能使用该页面的标准消息。
但是,当我从登录视图返回帐户页面时,视图并没有真正更新。因此,我想知道在按下某些按钮后是否无法重新加载视图,这些按钮可以再次检查用户是否登录并进行相应处理。
【问题讨论】:
我正忙着制作带有帐户页面的应用程序。我希望用户可以通过该页面登录,并且一旦他们成功登录,页面就会重新加载以显示他们的帐户信息,而不是说明他们必须登录才能使用该页面的标准消息。
但是,当我从登录视图返回帐户页面时,视图并没有真正更新。因此,我想知道在按下某些按钮后是否无法重新加载视图,这些按钮可以再次检查用户是否登录并进行相应处理。
【问题讨论】:
如果你想触发布局或只是绘制有setNeedsLayout 和setNeedsDisplay
没有重新加载自定义数据的内置方法(在 iOS 上)
重新加载并在重新加载内部进行 - 调用 setNeedsDisplay
import UIKit
protocol MyViewDelegate {
func viewString() -> String;
}
class MyView : UIView {
var myViewDelegate : MyViewDelegate?
private var str : String?
func reloadData() {
if myViewDelegate != nil {
str = myViewDelegate!.viewString()
}
self.setNeedsDisplay()
}
override func drawRect(rect: CGRect) {
UIColor.whiteColor().setFill()
UIRectFill(self.bounds)
if str != nil {
let ns = str! as NSString
ns.drawInRect(self.bounds, withAttributes: [NSForegroundColorAttributeName: UIColor.blueColor(), NSFontAttributeName: UIFont.systemFontOfSize(10)])
}
}
}
class ViewController: UIViewController, MyViewDelegate {
func viewString() -> String {
return "blabla"
}
var v : MyView!
override func viewDidLoad() {
super.viewDidLoad()
v = MyView(frame: self.view.bounds)
self.view.addSubview(v)
v.myViewDelegate = self;
}
override func viewWillAppear(animated: Bool) {
v.reloadData()
}
}
【讨论】:
在 Swift 中使用这个,
如果你想重新加载 viewController 中的 UIView,只需使用 NotificationCenter。
在 ViewController 类中添加 viewWillAppear
override func viewWillAppear(_ animated: Bool) {
//Trigger notification
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "update"), object: nil)
}
在 UIView 类中为通知添加观察者
required init?(coder aDecoder: NSCoder) {
//Add Observer
NotificationCenter.default.addObserver(self, selector: #selector(updateList), name: NSNotification.Name(rawValue: "update"), object: nil)
}
@objc func updateList(){
//write Reload data here......
tableView.reloadData()
}
【讨论】:
Swift 本身已经非常先进,对于许多人来说,如果他们不知道我们只需一行简单的代码就可以刷新整个视图。
viewWillAppear(true)
【讨论】: