我试图让图像在UITableView中工作 - 如果可能的话,你可以查看代码,看看为什么我无法在cellForRowAtINdexPath中检索数组LogoURL,这也是正确的方法吗?非常感谢大家。杰森。
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.client = [MSClient clientWithApplicationURLString:@"
applicationKey:@""];
self.table = [self.client tableWithName:@"notifications"];
self.rowitems = [[NSMutableArray alloc] init];
MSQuery *query = [self.table query];
query.fetchLimit = 3;
[query readWithCompletion:^(NSArray *items, NSInteger totalCount, NSError *error)
{
//add the items to our local cop
self.rowitems = [items mutableCopy];
[self.TableView reloadData];
}];
}
- (void)SQLRetrieve:(NSString *)barID
{
//NSLog(@"%@", barID);
NSDictionary *barIDDictionary = @{ @"myParam": barID};
self.client = [MSClient clientWithApplicationURLString:@"https://outnight-mobile.azure-mobile.net/" applicationKey:@"okYeRGfBagYrsbkaqWIRObeDtktjkF10"];
[self.client invokeAPI:@"photos"
body:barIDDictionary
HTTPMethod:@"POST"
parameters:nil
headers:nil
completion:^(id result, NSHTTPURLResponse *response, NSError *error) {
if (error) {
NSLog(@"Error %@", error );
} else
{
NSString *string = [NSString stringWithFormat:@"%@", [result objectForKey:@"rows"]];
NSString *stringWithoutbracketsend = [string stringByReplacingOccurrencesOfString:@")" withString:@""];
NSString *stringWithoutbracketsfront = [stringWithoutbracketsend stringByReplacingOccurrencesOfString:@"(" withString:@""];
NSString *completion = [stringWithoutbracketsfront stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSString *newStr = [completion substringFromIndex:1];
NSString *finalstring = [newStr substringToIndex:newStr.length-(newStr.length>0)];
dispatch_async( dispatch_get_main_queue(), ^{
[self doSomethingWithReturnString:finalstring];
});
}
}];
}
-(void)doSomethingWithReturnString:(NSString*)string
{
self.LogoURL = [[NSMutableArray alloc] init];
[self.LogoURL addObject:string];
NSLog(@"%@", self.LogoURL);
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
return [self.rowitems count];
NSLog(@"%d",[self.rowitems count]);
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
NSDictionary *apt = [self.rowitems objectAtIndex:indexPath.row];
cell.textLabel.text = apt[@"content"];
[self SQLRetrieve:apt[@"barID"]];
return cell;
}
答案 0 :(得分:0)
在类注释单元格中定义单元格视图的方法是自身的初始化:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
{
// Initialization code
_dateLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 50)];
_noteLabel = [[UILabel alloc]initWithFrame:CGRectMake(110, 0, 200, 50)];
[self addSubview:_noteLabel];
[self addSubview:_dateLabel];
}
return self;
}
- (void)setDateLabelValue:(NSString *)dateValueString
{
_dateLabel.text = dateValueString;
}
- (void)setNoteLabelValue:(NSString *)noteValueString
{
_noteLabel.text = noteValueString;
}
在这里,我在tableview中使用它
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
NoteCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[NoteCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
}
NSDictionary *oneDict = [_noteBookArray objectAtIndex:indexPath.row];
[cell setDateLabelValue:[oneDict objectForKey:@"timestamp"]];
[cell setNoteLabelValue:[oneDict objectForKey:@"value"]];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}
这对你有帮助吗?
答案 1 :(得分:0)
数组为零的原因是因为[self.client invokeAPI..]
方法使用了回调 - 我认为您会发现cellForRowAtIndexPath
方法在完成处理程序完成之前完成。这基本上是一种竞争条件。
要在rowForIndexPath
中测试此位置,在完成处理程序中测试一个断点。我认为您会发现rowForIndexPath
在完成块之前完成执行。
你的数组将是nil,直到完成块调用doSomethingWithReturnString
,我相信它会在之后发生。
我建议你将[table reloadData]
移到SQLRetriveCode
中的补充处理程序中,这样只有在填充数组后才会调用cellForRowAtrIndexPath
。然后,您还需要将SQLRetriveCode
移出cellForRowAtrIndexPath
,否则永远不会被调用。我会把它放在你想要放置的位置,可能在viewDidLoad
的完成块中(如果只是为了测试它修复它)
答案 2 :(得分:0)
任何表视图图像加载问题都归结为以下步骤:
[tableView reloaddata]
cellForRowAtIndexPath
内,包含将从正确的数据模型对象设置图像的代码。由于表视图完成了单元重用,因此这一步可能不太古怪。为避免出现问题,请参阅表格视图中的this tutorial about lazy loading图像。