[英]Table view: disable a row or make an alert which stop a segue?
我在其viewDidLoad中填充了兩個表視圖,其中的數據來自包含商店名稱的sqllite數據庫。 在第一個視圖中,我選擇一個元素(即一個商店),然后在第二個視圖中,我必須選擇與第一個不同的另一個商店。
填滿第二張表視圖的一行后,我可以禁用它嗎?
我試圖不在第二個視圖中加載(第一個所選商店的名稱)的名稱,但是我在其viewDidLoad中填充了表格視圖,但是不幸的是,直到viewDidAppear和那一刻來不及填滿表格視圖。
我也嘗試以這種方式向在第二個視圖中選擇一行的事件添加警報
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *choosenSecondShop= [secondShop objectAtIndex:indexPath.row];
NSString* nameFirstShop = [function loadFirstShopChoosen];
if ([choosenSecondShop isEqualToString:nameFirstShop]) {
NSString *message=@"Second shop cannot match the first";
alert = [[UIAlertView alloc] initWithTitle:@"Errore"
message: message
delegate: self cancelButtonTitle: @"Ok"
otherButtonTitles:nil,
nil];
[alert show];
}else {
// go on with the app's stuff!
}
}
但在這種情況下,會顯示警報,但隨后還會顯示提示。 我可以阻止segue繼續嗎?
有幾種不同的方法可以解決此問題:
盡管我不確定從用戶體驗的角度來看這是一個好主意,但這應該可以工作。
大概您是從表格單元格開始在IB中進行搜索? 當您執行此操作時,將獲得不需要任何代碼來執行segue的便利(在您點擊表格單元格時,它會自動完成),但是您也無法對其進行任何運行時控制。
如果需要通過程序控制是否/何時/執行哪個序列,則應從視圖控制器本身(而不是從其中的控件)開始創建序列,並在IB中為序列提供唯一標識符。 然后,在您的tableView:didSelectRowAtIndexPath:
實現中,一旦知道要執行segue,就可以調用[self performSegueWithIdentifier:@"myIdentifier"]
。
為了防止選擇特定的單元格,您的表視圖控制器可以實現tableView:willSelectRowAtIndexPath:
為您不希望用戶選擇的任何索引路徑返回nil
。
如果這樣做,您可能想向用戶表明可以選擇哪些行-您可以在tableView:cellForRowAtIndexPath:
更改單元格的外觀。
您說要在viewDidLoad
填充表視圖,但實際上並不能這樣工作:表視圖通過在需要時調用數據源和委托方法來填充自身。 如果要防止將數據集中的項目顯示為表格中的單元格,則只需更改數據源和委托方法的行為即可:
tableView:numberOfRowsInSection:
返回的數字應比其他情況少 tableView:cellForRowAtIndexPath:
應該反映該項目的刪除; 就像是:
MyShop *shop; if (indexPath.row < indexOfFirstShop) shop = [shops objectAtIndex:indexPath.row]; else shop = [shops objectAtIndex:(indexPath.row + 1)]; // then configure cell for the chosen shop
現在,如果您在第一次調用這些方法時不知道要隱藏哪一行,那么一旦獲得該信息,您需要做的就是告訴表視圖它需要再次調用它們: [self.tableView reloadData]
應該可以解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.