在 Swift 中重新加载/更新视图

Posted

技术标签:

【中文标题】在 Swift 中重新加载/更新视图【英文标题】:Reload/Update View In Swift 【发布时间】:2015-03-03 08:30:25 【问题描述】:

我正忙着制作带有帐户页面的应用程序。我希望用户可以通过该页面登录,并且一旦他们成功登录,页面就会重新加载以显示他们的帐户信息,而不是说明他们必须登录才能使用该页面的标准消息。

但是,当我从登录视图返回帐户页面时,视图并没有真正更新。因此,我想知道在按下某些按钮后是否无法重新加载视图,这些按钮可以再次检查用户是否登录并进行相应处理。

【问题讨论】:

【参考方案1】:

如果你想触发布局或只是绘制有setNeedsLayoutsetNeedsDisplay

没有重新加载自定义数据的内置方法(在 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()
    

【讨论】:

你认为你可以给我举个例子吗,因为我不完全理解你的意思。 谢谢你,这帮了我很大的忙,我现在开始工作了!【参考方案2】:

在 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()
   

【讨论】:

它只会重新加载 tableView,而不是整个视图。【参考方案3】:

Swift 本身已经非常先进,对于许多人来说,如果他们不知道我们只需一行简单的代码就可以刷新整个视图。

viewWillAppear(true)

【讨论】:

我已经有一段时间没能玩 Swift 了,但即便如此,我很确定这不会起作用,除非你把所有的刷新逻辑都放在 viewWillAppear 函数中,在这种情况下,您不妨创建一个不同的函数并调用该函数。

以上是关于在 Swift 中重新加载/更新视图的主要内容,如果未能解决你的问题,请参考以下文章

更新数据源后未重新加载 Rx 表视图

在 UITableView (swift2) 中选择单元格时更新/重新加载 ViewController

多次重新加载 TableView Swift

从 AppDelegate Swift 4 更新 tableView 行

Swift - 在 vi​​ewDidAppear 中使用新信息重新加载 UIPageViewController

Swift数组追加不适用于collectionView重新加载数据