所以我自己学得很快,而且我遇到了障碍。让我们想象一下登录情况。如果用户已登录,则导航菜单会在表格视图中显示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()方法基本上刷新包含选项
的tableviewfunc updateMenu(){
self.menuTableView.beginUpdates()
self.menuTableView.endUpdates()
}
但它会抛出此错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
我知道这个错误是因为当页面没有加载到屏幕时它在MenuController中调用self,但这是更新菜单的唯一方法。我怎么能这样做?请任何帮助表示赞赏。
答案 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类实例无法正常通信。
我看到有三种方法可以解决这个问题,
我个人会选择使用封闭,因为我很喜欢它们。但我的许多同事和老年人可能会说代表是这样做的正确方法。同样,由于您是开发人员,因此完全取决于您。
祝你好运。