自定义 UITableViewCell 中的属性未针对 UISearchDisplayController 表进行初始化

发布于 2025-01-06 07:08:44 字数 1660 浏览 0 评论 0原文

我使用 UISearchDisplayController 能够根据我从服务器检索的一些数据显示带有自定义单元格的表格。

首先,我在 UIViewController 中设置 UISearchDisplayController。

self.searchController = [[UISearchDisplayController alloc]
                             initWithSearchBar:self.mySearchBar contentsController:self];
        self.searchController.delegate = self;
        self.searchController.searchResultsDataSource = self;
        self.searchController.searchResultsDelegate = self;

我的 UIViewController 还实现了 UISearchBarDelegate,因此我可以确定搜索何时开始。我设置了一个块,以便当我的 api 调用返回时,它会被调用,并将结果字典保存在 self.searchResults 属性中:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    // here we make the api call
    [api getSomeInfo:searchBar.text complete:^(NSDictionary *json) {

        self.searchResults = json;
        [self.searchController.searchResultsTableView reloadData];
    }];
}

现在,我遇到的问题是在我的 UITableViewDataSource 方法中,我返回自定义单元格。我的单元格已实例化,但 IBOutlet 从未初始化,因此我无法正确设置其内容(文本、图像等):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (tableView == self.searchController.searchResultsTableView) {

        cell = [tableView dequeueReusableCellWithIdentifier:@"SearchResultsCellIndentifier"];

        if (cell == nil) {
            cell = [[SearchResultsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }

        cell.customLabel.text = [self.searchResults objectForKey:@"customText"];  // cell exists but cell.customLabel is nil!!
    }

}

为什么内容为零?我的自定义单元类中是否有某个地方应该设置内容?

谢谢!

I am using a UISearchDisplayController to be able to display a table with custom cells based on some data I am retrieving from a server.

First I set the UISearchDisplayController inside my UIViewController.

self.searchController = [[UISearchDisplayController alloc]
                             initWithSearchBar:self.mySearchBar contentsController:self];
        self.searchController.delegate = self;
        self.searchController.searchResultsDataSource = self;
        self.searchController.searchResultsDelegate = self;

My UIViewController also implements the UISearchBarDelegate, so I can determine when a search starts. I set up a block so when my api call returns it gets called and a dictionary of results is saved in the self.searchResults property:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    // here we make the api call
    [api getSomeInfo:searchBar.text complete:^(NSDictionary *json) {

        self.searchResults = json;
        [self.searchController.searchResultsTableView reloadData];
    }];
}

Now, the problem I have is that in my UITableViewDataSource method, where I return the custom cell. My cell is instantiated, but it's IBOutlets never get initialized, so I cannot set their content (text, images, etc) properly:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (tableView == self.searchController.searchResultsTableView) {

        cell = [tableView dequeueReusableCellWithIdentifier:@"SearchResultsCellIndentifier"];

        if (cell == nil) {
            cell = [[SearchResultsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }

        cell.customLabel.text = [self.searchResults objectForKey:@"customText"];  // cell exists but cell.customLabel is nil!!
    }

}

Why is the content nil? Is there somewhere in my Custom Cell class where I should be setting the content up?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

生寂 2025-01-13 07:08:44

我认为您的问题是您在创建单元时使用了变量 cellIdentifier ,但在出列时使用了字符串常量。

简单地总是重新创建一个单元就可以了,但效率很低,并且会导致严重的内存泄漏。

您应该首先根据您所在的表视图以及您需要的单元类型设置 cellIdentifier,然后使用该 cellIdentifier 出列,然后根据需要创建一个新单元格。

I think your problem is that you used the variable cellIdentifier when creating the cell, but a string constant when dequeuing.

Simply always recreating a cell will work, but is not efficient at all and leads to major memory leaks.

You should first set the cellIdentifier according to which table view you are in, and which kind of cell you need, then dequeue with that cellIdentifier, and then create a new one if needed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文