簡體   English   中英

如何使用NSPredicate過濾此對象數組?

[英]How do I filter this object array using NSPredicate?

How do I filter this object array using NSPredicate filteredArrayUsingPredicate / predicateWithBlock?

Person是我的模態類,它具有多個屬性,如firstNamelastName等。此類的每個對象存儲在數組objPersonCell 從我的視圖控制器,我正在使用以下方法在UITableViewCell上顯示字段:

// way similar to this
        for(NSMutableArray *obj in self.objPersonCell){   
            lblFirstName.text = [(Person *)obj personType];
        }

問題:對於搜索,我希望用戶使用NSPredicate鍵入和過濾NSPredicate並通過在UITableView上重新加載數據立即反映更改。 現在如何使用NSPredicate

我試過的是:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        NSString *searchTerm = [textField.text stringByReplacingCharactersInRange:range withString:string];
        [self updateAsPerSearchTerm: searchTerm];

        return YES;
    }

-(void)updateAsPerSearchTerm:(NSString *)searchTerm
{

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self contains[cd] %@",searchTerm];
    NSArray *sortedArray = [[(Person *)self.objPersonCell] filteredArrayUsingPredicate:predicate];

    [self.objPersonCell removeAllObjects];
    [self.objPersonCell addObjectsFromArray:sortedArray];
    [self.tableView reloadData];
}

updateAsPerSearchTerm內部的代碼對於傳遞objPersonCell是錯誤的。 我該如何設置。 如果可以的話, predicateWithBlock如何更好地幫助我?

您似乎對轉換感到困惑。 這段代碼:

for(NSMutableArray *obj in self.objPersonCell){   
    lblFirstName.text = [(Person *)obj personType];
}

應該

for (Person *obj in self.objPersonCell){   
    lblFirstName.text = [obj personType];
}

因為objPersonCell數組的內容是Person對象。

類似的問題在這里:

NSArray *sortedArray = [[(Person *)self.objPersonCell] filteredArrayUsingPredicate:predicate];

你應該在哪里

NSArray *sortedArray = [self.objPersonCell filteredArrayUsingPredicate:predicate];

現在,關於過濾問題,您應該具有幾個屬性:

@property (strong, nonatomic) NSMutableArray *objPersonCell;
@property (strong, nonatomic) NSArray *tableDataSource;

默認:

self.tableDataSource = self.objPersonCell;

搜索時:

self.tableDataSource = sortedArray;

當您取消/完成搜索時:

self.tableDataSource = self.objPersonCell;

這樣,您就不會在搜索(和破壞其內容)時編輯objPersonCell ,並且表數據源方法保持簡單,因為您沒有嘗試在不同的源數組之間進行切換。 該表數據源的方法應該只使用tableDataSource ,不objPersonCell

暫無
暫無

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

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