gpt4 book ai didi

ios - 无法分配给 searchResultsTableView 自定义单元格的 UILabel

转载 作者:行者123 更新时间:2023-11-28 22:20:55 24 4
gpt4 key购买 nike

一切正常,但无法为 searchResultsTableView 的自定义单元格的 UILable 赋值。我为我的 TableView Controller 使用相同的自定义 UITableViewCell,它是 searchDisplayController。我正在为 TableView Controller 和 TableView 单元格使用 Storyboard。正如您在代码中看到的那样,如果我 NSLog self.searchResults[indexPath.row][@"name"] 的值,我可以在控制台中看到结果,但是如果我将此值分配给 cell.name.text ,它不会工作,但在 TableView Controller 中,它正在工作。单元格的 imageView 正在工作,我无法为单元格的 UILabel 分配任何值。

- (void)viewDidLoad
{
[super viewDidLoad];

[self.searchDisplayController.searchResultsTableView registerClass:[LocalCell class] forCellReuseIdentifier:@"Cell2"];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
static NSString *CellIdentifier2 = @"Cell2";

if (tableView == self.searchDisplayController.searchResultsTableView) {
LocalCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2 forIndexPath:indexPath];
if (!cell) {
cell = [[LocalCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier2];
}
cell.name.text = self.searchResults[indexPath.row][@"name"];
NSLog(@"%@", self.searchResults[indexPath.row][@"name"]); // has value
NSLog(@"%@", cell.name.text); // null
return cell;

} else
{
LocalCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (!cell) {
cell = [[LocalCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.name.text = self.restaurants[indexPath.row][@"name"];
return cell;
}
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

return 80;

}

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
float radius = 1000.0f;
NSString *searchContent = [searchBar.text stringByReplacingOccurrencesOfString:@" " withString:@"%20"];

if ([searchContent length] > 0) {
NSString *urlString = [NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=%f,%f&radius=%f&types=food&key=%@&sensor=true&name=%@", [[[NSUserDefaults standardUserDefaults] objectForKey:@"lat"] floatValue], [[[NSUserDefaults standardUserDefaults] objectForKey:@"lon"] floatValue], radius, AppKey, searchContent];
__weak LocalViewController *weakSelf = self;
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];

NSURLSessionDataTask *taks = [session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
weakSelf.nextPageToken = dict[@"next_page_token"];
weakSelf.searchResults = dict[@"results"];
NSLog(@"search results: %@", weakSelf.searchResults);
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf.searchDisplayController.searchResultsTableView reloadData];
});
}

}];
[taks resume];
}
}

本地单元格.h

#import <UIKit/UIKit.h>

@interface LocalCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UILabel *name;

@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UILabel *desc;
@property (weak, nonatomic) IBOutlet UILabel *distance;

@end

最佳答案

我看了你的项目:

NSLog(@"%@", cell.name.text); // null 

因为 cell.name 是 nil。解释是:然后你加载你的普通 tableView,单元格“LocalCell”从 Storyboard 加载,分配和初始化你的标签,但是你使用 self.searchDisplayController.searchResultsTableView 你初始化“LoadCell”,但从不初始化他的标签(因为它们是弱的 IBOutlets - 并在 Storyboard中使用)。

为了解决您的问题,我找到了 3 个解决方案:1. 创建另一个 SearchCell,强引用他的 UILabel,在 SearchCell 的 -(id)init 中初始化所有 UILabel。然后在您的 Controller 中使用它。

[self.searchDisplayController.searchResultsTableView registerClass:[SearchCell class] forCellReuseIdentifier:@"SearchCell"];

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
static NSString *SearchCellIdentifier = @"SearchCell";

Restaurant *res;

if (tableView == self.searchDisplayController.searchResultsTableView)
{
SearchCell *cell = [tableView dequeueReusableCellWithIdentifier:SearchCellIdentifier forIndexPath:indexPath];
if (!cell) {
cell = [[SearchCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

res = (Restaurant *)self.searchResults[indexPath.row];

cell.nameLabel.text = res.name;
cell.descLabel.text = res.desc;

// image load

return cell;
}
else
{
LocalCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (!cell) {
cell = [[LocalCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

res = (Restaurant *)self.restaurants[indexPath.row];

cell.nameLabel.text = res.name;
cell.descLabel.text = res.desc;

// image load

return cell;
}
}

另一种方法是使用您的单元格“SearchCellNib”创建一个 nib,并使用您创建的 LoadCell 类。对于负载 Nib 使用:

cell = (LoadCell*)[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
cell = (LoadCell*)[[[NSBundle mainBundle] loadNibNamed:@"SearchCellNib" owner:nil options:nil] objectAtIndex:0];
}

或者使用 UITableViewCell

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SearchCellIdentifier forIndexPath:indexPath];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}

res = (Restaurant *)self.searchResults[indexPath.row];

cell.textLabel.text = res.name;
cell.detailTextLabel.text = res.desc;

关于ios - 无法分配给 searchResultsTableView 自定义单元格的 UILabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20439614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com