菜鸟教程小白 发表于 2022-12-12 22:31:23

iphone - UITableView 搜索后应用崩溃


                                            <p><p>如果我这样做,我的应用程序会崩溃:</p>

<ol>
<li><p>我在我的 UITableView 上进行搜索</p></li>
<li><p>搜索后我点击 <code>searchDisplayController</code> UITableView 的 UITableViewCell 并转到另一个 ViewController </p></li>
<li><p>然后我回到主 UITableView,<code>questionTable</code> - 我在其中搜索的那个,然后点击最后一个单元格,或者任何大于搜索结果数量的单元格我以前有过。</p></li>
<li><p>应用程序因此错误而崩溃:</p>

<pre><code>*** Terminating app due to uncaught exception &#39;NSRangeException&#39;, reason: &#39;*** -: index 12 beyond bounds &#39;
*** First throw call stack:(0x35aa188f 0x37e48259 0x359ea9db 0x155fd 0x3384df5b 0x153ed 0x3358793d 0x33601627 0x355bb933 0x35a75a33 0x35a75699 0x35a7426f 0x359f74a5 0x359f736d 0x37693439 0x33503cd5 0x95a3 0x9548) terminate called throwing an exception(lldb)
</code></pre> </li>
</ol>

<p>我怀疑问题出在我的代码上,因为搜索 UITableView 对我来说是一个新话题。我就是这样做的:</p>

<p>1.我的VC符合这些协议(protocol)<code><UITableViewDataSource, UITableViewDelegate, UISearchDisplayDelegate, UISearchBarDelegate></code></p>

<p>2.我有这些变量:</p>

<pre><code>@property (nonatomic, retain) NSMutableArray *searchResults;
@property (nonatomic, copy) NSString *savedSearchTerm;
</code></pre>

<p>3。在 <code>viewDidLoad</code> 我设置了我搜索的 UITableView 的来源:</p>

<pre><code>    self.questionList = [
                     initWithObjects: MY OBJECTS HERE, nil];

if ()
{
    [[ searchBar] setText:];
}
</code></pre>

<p>4。我有这个 Action 来处理搜索:</p>

<pre><code>- (void)handleSearchForTerm:(NSString *)searchTerm
{
;

if ( == nil)
{
    NSMutableArray *array = [ init];
    ;
}
[ removeAllObjects];

if ([ length] != 0)
{
    for (NSString *currentString in )
    {
      if (.location != NSNotFound)
      {
            [ addObject:currentString];
      }
    }
}   
}
</code></pre>

<p>5) 以下是我设置 UITableView 的方法:</p>

<pre><code>    (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    NSInteger row = ;
    NSString *contentForThisRow = nil;

    if (tableView == [ searchResultsTableView])
      contentForThisRow = [ objectAtIndex:row];
    else
      contentForThisRow = [ objectAtIndex:row];

    static NSString *CellIdentifier = @&#34;questionsCell&#34;;

    UITableViewCell *cell = ;
    if (cell == nil)
    {
      cell = [ initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    [ setText:contentForThisRow];
    return cell;
    }
</code></pre>

<p>6) 我的 <code>numberOfRowsInSection</code> 方法如下所示:</p>

<pre><code>(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSInteger rows;

if (tableView == [ searchResultsTableView])
rows = [ count];
else
rows = [ count];
return rows;
}
</code></pre>

<p>7) 最后,我有这两种方法:</p>

<pre><code>(BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
    ;
    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
    ;
    [ reloadData];
}
</code></pre>

<p>对于这个冗长的问题,我真的很抱歉。我在代码中犯了一些错误,我希望有人能告诉我正确的方法。搜索栏 Controller 在 IB 中正确链接
任何帮助将不胜感激!</p>

<p><strong>新编辑:</strong>
我正在 <code>didSelectRowAtIndePath</code> 上推一个新的 VC:</p>

<pre><code>- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ;
}
</code></pre>

<p>我正在那里更新一个 NSString。当我只使用一个 TableView 时它工作得很好</p>

<pre><code>- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    ((QandADetailsViewController *)segue.destinationViewController).delegate=self;

    NSIndexPath *indexPath = (NSIndexPath *)sender;

    QandADetailsViewController *mdvc = segue.destinationViewController;

    if (self.searchResults == nil) {
      mdvc.questionName = [self.questionList
                           objectAtIndex:indexPath.row];
    } else {
      mdvc.questionName = [self.searchResults
                           objectAtIndex:indexPath.row];
    }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>在为 segue 做准备时,对 searchResults == nil 的检查可能不正确。没有理由期望在第一次搜索后它会为零。这意味着您将始终在后续表选择中取消引用搜索数组,从而解释索引超出范围。 </p>

<p>我认为解决方法是询问 <code>if ()</code> 而不是搜索结果是否存在。</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - UITableView 搜索后应用崩溃,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/12101116/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/12101116/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - UITableView 搜索后应用崩溃