在Controller2 swift中的方法之后更新Controller1中的tableView

时间:2017-09-22 14:04:02

标签: ios swift uitableview

所以我自己学得很快,而且我遇到了障碍。让我们想象一下登录情况。如果用户已登录,则导航菜单会在表格视图中显示2个选项。如果用户不是,则菜单显示1选项。但是登录发生在不同的页面和控制器中。 我的问题是当用户登录时,登录页面被解除但菜单没有更新,直到我在Xcode中关闭应用程序并重新运行它。 这是LoginController中的方法:

func saveUserAsLoggedIn(name: String){
        // add user login to user defaults. Works perfect.
        self.dismiss(animated: true, completion: nil)
        MenuController().updateMenu() // this is calling a method in the menuController
}

并且updateMenu()方法基本上刷新包含选项

的tableview
func updateMenu(){
      self.menuTableView.beginUpdates()
      self.menuTableView.endUpdates()
}

但它会抛出此错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

我知道这个错误是因为当页面没有加载到屏幕时它在MenuController中调用self,但这是更新菜单的唯一方法。我怎么能这样做?请任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

这是一个简单的问题,抛出的错误不是因为你的想法。

Sub RemoveNullColumn()
    Dim c, count, r, lc, FirstCell
    Application.ScreenUpdating = False
    count = 0
    r = ActiveCell.row      'lets you choose where you want to start even if it is not at "A1"
    c = ActiveCell.Column   'lets you choose where you want to start even if it is not at "A1"
    c = GetLetterFromNumber(c)  'Gets the column letter from the number provided above
    FirstCell = c & r       'sets the cell that you selected to start in so that you will end thereafter removing all the NULL

    lc = ActiveSheet.Cells(1, Columns.count).End(xlToLeft).Column   'Finding the last used column
    For H = ActiveCell.Column To lc Step 1      'Starts with where you selected a cell and moves right to the last column
        For x = 1 To Range(c & Rows.count).End(xlUp).row Step 1     'Starts with the first row and moves through the last row
            count = count + 1
            If Range(c & x).Value = "NULL" Then 'Checks the contents fo the cell to see if it is "NULL"
                Range(c & x).Clear
            End If
            If count = 1000 Then    'This was used testing but is not seen with the ScreenUpdating set to false
                Range(c & x).Select
                count = 1
            End If
        Next x
        ActiveCell.Offset(0, 1).Select  'select the next column
        c = ActiveCell.Column
        c = GetLetterFromNumber(c)      'get the letter of the next column
    Next H
    Application.ScreenUpdating = True
    MsgBox "Finished"
    Range(FirstCell).Select
End Sub

Function GetLetterFromNumber(Number)
    GetLetterFromNumber = Split(Cells(1, Number).Address(True, False), "$")(0)
End Function

这行代码正在创建一个MenuController CLASS的新实例,因为实例的VIEW尚未加载(因为它还没有在视图堆栈中)。它的menuTableView插座是MenuController().updateMenu()

所以问题是你没有正确的menuTableView实例进行更新。换句话说,您的MenuController和LoginController类实例无法正常通信。

我看到有三种方法可以解决这个问题,

  1. 使用代理:如果您不确定,请阅读代理方法。它是类可以相互通信的方式之一。 在这种方法中,您将在LoginController中拥有MenuController的实例,以便您可以直接调用和更新menuTableView
  2. 使用闭包:如果您不熟悉它,请再次阅读闭包,因为它是swift提供的强大工具之一。在这个apprach中,您将定义一组要在MenuController中执行的语句,但该语句的执行由LoginController触发。
  3. 传递tableView实例:或者你可以鲁莽地将tableView的实例从MenuController传递给LoginController,以便你可以从LoginController重新加载它。但是,我不会喜欢这个。
  4. 我个人会选择使用封闭,因为我很喜欢它们。但我的许多同事和老年人可能会说代表是这样做的正确方法。同样,由于您是开发人员,因此完全取决于您。

    祝你好运。