Iphone 使用uisearchbar在uitableview中搜索时键盘卡住。。。?
我有一个uitableview和uisearchbar。我正在绑定一个包含大量记录的表,并为用户提供搜索功能。但很多时候,当数据量很大时,键盘无法正常工作,它会重新加载表。不管怎样,我都可以异步搜索。这是iOS4应用程序 我的uisearchbar textDidChange方法如下Iphone 使用uisearchbar在uitableview中搜索时键盘卡住。。。?,iphone,uitableview,uisearchbar,Iphone,Uitableview,Uisearchbar,我有一个uitableview和uisearchbar。我正在绑定一个包含大量记录的表,并为用户提供搜索功能。但很多时候,当数据量很大时,键盘无法正常工作,它会重新加载表。不管怎样,我都可以异步搜索。这是iOS4应用程序 我的uisearchbar textDidChange方法如下 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ if(searchText.length == 0
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
if(searchText.length == 0)
{
isFiltered = FALSE;
}
else
{
@autoreleasepool {
isFiltered = true;
membersMFilterArray = [[NSMutableArray alloc] init];
int lineCount = [[[membersMArray objectAtIndex:0] valueForKey:@"LineCount"] intValue];
NSString *membersMArrayValue;
for (int i=0; i<[membersMArray count]; i++)
{
membersMArrayValue = [membersMArray objectAtIndex:i];
NSString *line;
for (int j=0; j<lineCount; j++)
{
line = [NSString stringWithFormat:@"Line%d",j+1];
NSRange lineRange = [[membersMArrayValue valueForKey:line] rangeOfString:searchText options:NSCaseInsensitiveSearch];
if(lineRange.location != NSNotFound)
{
[membersMFilterArray addObject:[membersMArray objectAtIndex:i]];
break;
}
}
}
}
}
[tblMember reloadData];}
)简而言之,答案是肯定的。您可以异步执行搜索,例如,使用。然后可以通知表视图的数据源进行更新 不过,最好是让您的搜索更高效,并实现可接受的实时更新。如何实现这一点,取决于数据的存储和索引方式。例如,如果您使用的是核心数据,则必须调整NSFetchedResultsController,并可能使用要搜索的较长字符串中出现的单个字符串构造一个新实体 查看您的搜索代码,您有两个嵌套循环—这几乎肯定会导致性能下降。也许你应该考虑一些苹果的自动迭代机制,(还有迭代,但在幕后),比如关键路径或谓词。例如,类似于:
resultArray = [membersArray filteredArrayUsingPredicate:
[NSPredicate predicateWithFormat:@"self CONTAINS[cd] %@", searchText]];
从您的代码来看,我认为两个for循环是不必要的。使用更好的概念对数组项进行排序 我提出了一些加速的建议
Remove the auto-release-pool
Use one for-loop instead of two
您可以使用NSlog查看执行的开始和结束时间。发现过程所花费的时间并修复它
示例:
NSLog(@"loop1 started now")
for (int i=0; i<[membersMArray count]; i++)
{
membersMArrayValue = [membersMArray objectAtIndex:i];
NSString *line;
for (int j=0; j<lineCount; j++)
{
NSLog(@"loop2 started now")
line = [NSString stringWithFormat:@"Line%d",j+1];
NSRange lineRange = [[membersMArrayValue valueForKey:line] rangeOfString:searchText options:NSCaseInsensitiveSearch];
if(lineRange.location != NSNotFound)
{
[membersMFilterArray addObject:[membersMArray objectAtIndex:i]];
break;
}
}
NSLog(@"loop2 ended now")
}
NSLog(@"loop1 ended now")
NSLog(@“loop1立即启动”)
对于(int i=0;ishare是搜索代码..或者您在真实设备中测试过吗?如果在模拟器中发现问题,可能是您的系统性能问题。在我的情况下,模拟器的工作速度比设备快,我的mac中有i5处理器。提供的屏幕截图来自设备。@Deer:您得到答案了吗?我在搜索时也面临同样的问题。请共享e你和我的经验。不,我没有使用coredata。所有数据都来自webservice输出,我将它们存储在我的nsarray中。然后从中搜索。你好,mundi,我已经使用谓词,但它对我没有帮助,这就是为什么我转向上面的循环。你好,Ramshad,请用我更新的数组检查我的帖子。我想我必须通过两个循环。
NSLog(@"loop1 started now")
for (int i=0; i<[membersMArray count]; i++)
{
membersMArrayValue = [membersMArray objectAtIndex:i];
NSString *line;
for (int j=0; j<lineCount; j++)
{
NSLog(@"loop2 started now")
line = [NSString stringWithFormat:@"Line%d",j+1];
NSRange lineRange = [[membersMArrayValue valueForKey:line] rangeOfString:searchText options:NSCaseInsensitiveSearch];
if(lineRange.location != NSNotFound)
{
[membersMFilterArray addObject:[membersMArray objectAtIndex:i]];
break;
}
}
NSLog(@"loop2 ended now")
}
NSLog(@"loop1 ended now")