我相信這個問題的答案是尷尬基本,但我很難理解XCode中的實時編譯/錯誤檢查應該如何與Objective-C的動態特性一起工作。如何處理動態代碼塊中的Objective-C錯誤?
例如,我想爲我的堆棧視圖控制器中的任何topViewController的tableView設置編輯:YES。所以我試試這個:
[self.navigationController.topViewController.tableView setEditing: YES animated: YES];
和XCode抱怨:Property 'tableView' not found on object of type 'UIViewController'
。
現在,這段代碼在UIViewController中,但只有在topViewController是UITableViewController時纔會調用,但顯然Xcode不知道。
我該如何解決這個問題?這是否表明我的編碼做法不好?我試圖在一個條件包裝線測試該topViewController.tableView!=零,但Xcode然後只是婊子關於條件線:)
編輯:由saadnib和迦勒下面的答案,這是我現在有:
if ([self.navigationController.topViewController isKindOfClass:([UITableViewController class])]) {
UITableViewController *topController = (UITableViewController *)self.navigationController.topViewController;
[topController.tableView setEditing: YES animated: YES];
}
更好地使用'-respondsToSelector:' – JeremyP 2011-04-04 08:24:31
@JeremyP,我通常會同意,並且我首先在答案中提出了這個問題,然後把它拿出來。如果您使用-respondsToSelector :,您仍然需要將指針轉換爲具有-tableView方法的某種類型,或者轉換爲id(如果向ID發送任何消息,編譯器不會投訴)。 id似乎是錯誤的方向,因爲我們已經知道它至少是一個UIViewController,並且OP完全期望它是一個UITableViewController,所以我們真的在問「它是類UITableViewController的一個實例」,而不是「它是否響應-tableView「。 – Caleb 2011-04-04 12:58:54
'id'很好,並且符合Objective-C動態類型的精神。 '-respondsToSelector:'即使將該方法添加到具有類別的基類中也是有效的。另一方面,如果你打算使用很多在子類中定義的方法,'-isKindOfClass:'可能會更好(或創建一個協議並使用'-conformsToProtocol:') – JeremyP 2011-04-04 13:15:52