簡體   English   中英

向uiTableView添加新行

[英]add new row to a uiTableView

我正在嘗試向UITableView添加新行。 用戶在UIViewControllerUITextField輸入數據,然后控件返回到原始UITableView 添加新行時,表將寫入哪種方法。 我似乎已經嘗試了一切。 似乎沒有任何工作。

來自以下注釋的代碼是:

    tableItems = [NSMutableArray arrayWithObjects:@"Persian", @"Rag Doll", @"Siamese", @"Scottish Fold", @"British short hair", nil];
    [self.tableView reloadData];
}

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"AddSegue"])
    {
        UINavigationController *nav = segue.destinationViewController;
        AddItemViewController *aivc = [nav.viewControllers objectAtIndex:0];
        aivc.TVC = self;
    }
}

如果要將新行數據存儲在(例如)由UITableView訪問的數組中,則只需重新加載表,如下所示:

[self.tableview reloadData];

我已經用您在評論中提供的另一個答案的代碼更新了您的問題。

最重要的是,您沒有告訴我們在哪里生成異常,也沒有告訴我們異常是什么。 如果您希望我們提供幫助,則需要縮小范圍。 另外,我不確定從以下事實可以得出什么結論:您建議在輸入UITextField之后返回到先前的控制器后才引起異常,但是您沒有向我們顯示該代碼,而是向我們展示了用於序列化到AddItemViewController的代碼。 第一次進行搜索時,還是嘗試彈出/關閉以使用UITableView返回到視圖控制器時,是否遇到錯誤?

盡管存在那些相當重要的問題,我還是建議兩件事:

首先,請確保您要對結果進行強大的檢查,以防止發生異常情況。 例如,一個常見的問題是從屬性或NSArray檢索值,但是由於一個或另一個原因,它不是代碼假定的對象類型(並要求它是對象)。 在這種情況下,您假設destinationViewControllerUINavigationController ,並且還假設其viewControllers數組中的第一個元素是AddItemViewController 您知道您的代碼,並且可能對此事實充滿信心,但是您將獲得異常這一事實意味着您可能需要更強大的錯誤檢查。

因此,我建議您包括將驗證這一事實的NSAssert語句。 以您的prepareForSegue為例,我建議這樣更改它:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"AddSegue"])
    {
        UINavigationController *nav = segue.destinationViewController;
        NSAssert([nav isKindOfClass:[UINavigationController class]], @"destinationViewController is not a UINavigationController");

        AddItemViewController *aivc = nav.viewControllers[0];
        NSAssert([aivc isKindOfClass:[AddItemViewController class]], @"destinationViewController.viewControllers[0] is not a AddItemViewController");

        aivc.TVC = self;
    }
}

NSAssert語句是在測試過程中測試值的好方法,可確保返回的對象確實屬於您認為的Class 這些NSAssert子句僅用於開發期間要測試的錯誤,但絕不會在生產應用程序中發生。 如果您的代碼對方法返回的內容進行了隱式假設,則可以在調試應用程序時使用NSAssert驗證這些假設。

現在,我沒有理由知道navaivc的值是否是您的問題,但這是檢查代碼應執行的一種示例。 這只是一個好習慣(特別是如果您正在努力尋找異常的情況下),以確保檢索到的對象是正確的類型,其余的代碼取決於該類型。

我這里有別有用心。 您的代碼意味着您正在導航到本身嵌入在其自己的導航控制器中的視圖控制器。 您在敘述中從未說過太多,因此這些NSAssert語句僅驗證了這一事實。

其次,如果所有可靠的對象驗證都未能解決問題,那么您必須自己確定異常的來源。 通常,您可以通過在“調試導航器”中查看堆棧跟蹤或通過讀取Xcode控制台中的錯誤來解密此錯誤。 但是,另一個斷斷續續的工具(恕我直言,恕我直言)是異常斷點 ,可以找到導致異常的確切代碼行。 如果遇到任何異常,我通常會在“所有”異常上添加一個異常斷點。 這樣,如果我通過調試器運行程序,如果遇到異常,它將在令人討厭的行停止代碼,從而大大簡化了確定問題根源的過程。 它並不總是能完美運行,但是它比其他技術經常更快地找到異常的來源。

異常斷點

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM