2011-04-04 55 views
1

我相信這個問題的答案是尷尬基本,但我很難理解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]; 
} 

回答

4

其實你可以通過類型化來訪問topViewController的屬性。例如你的topViewController名稱爲「FirstViewController」,那麼你可以這樣做,因爲

FirstViewController *fvc = (FirstViewController*)self.navigationController.topViewController; 

[fvc.tableView setEditing: YES animated: YES]; 

我希望這會幫助你。

1

由於self.navigationController.topViewController返回類型爲UIViewController*的指針,並且UIViewController沒有tableView屬性,所以出現錯誤。 @ saadnib的答案是正確的:如果你知道指針總是指向某個UIViewController子類,那麼可以將它轉換爲該類型。

但是,即使您「知道」頂視圖控制器始終是一個表視圖控制器,但您可能希望在運行時檢查是這種情況。您可以使用-isKindOfClass:來查看控制器是否是UITableViewController的子類。當然,你仍然需要演員,但它會更安全一些。

+1

更好地使用'-respondsToSelector:' – JeremyP 2011-04-04 08:24:31

+0

@JeremyP,我通常會同意,並且我首先在答案中提出了這個問題,然後把它拿出來。如果您使用-respondsToSelector :,您仍然需要將指針轉換爲具有-tableView方法的某種類型,或者轉換爲id(如果向ID發送任何消息,編譯器不會投訴)。 id似乎是錯誤的方向,因爲我們已經知道它至少是一個UIViewController,並且OP完全期望它是一個UITableViewController,所以我們真的在問「它是類UITableViewController的一個實例」,而不是「它是否響應-tableView「。 – Caleb 2011-04-04 12:58:54

+0

'id'很好,並且符合Objective-C動態類型的精神。 '-respondsToSelector:'即使將該方法添加到具有類別的基類中也是有效的。另一方面,如果你打算使用很多在子類中定義的方法,'-isKindOfClass:'可能會更好(或創建一個協議並使用'-conformsToProtocol:') – JeremyP 2011-04-04 13:15:52