使用 RESTful API 时更新 UI
Posted
技术标签:
【中文标题】使用 RESTful API 时更新 UI【英文标题】:Updating UI in when consuming RESTful API 【发布时间】:2016-08-11 00:57:55 【问题描述】:我的 UI 在一个视图控制器中使用滚动视图和分页以及 UITableView。为了加载 UI,我使用了一组 NSDictionaries (sourceArray),其中包含绘制 UI 的必要信息。该数组是通过使用返回记录数组的 RESTful API 创建的。我在完成处理程序中返回该数组。后来我将该数组与其他一些键:值对一起添加以创建 NSDictioary,稍后将其添加到 sourceArray 以进行 UI 绘图。
现在我的问题是如何根据 sourceArray 的变化更新我的 UI。我打电话给 [self.view layoutIfNeeded];但它不会强制重绘。
- (void)getStateDetails
NSArray *statesArray = [self getStates];
for (NSString *state in statesArray)
[self getStateDetailsInState:state withCompletionBlock:^(NSArray *records)
NSLog(@"%@",records);
NSDictionary *dict = @
@"kImage": state,
@"kName": state,
@"kRecord": records
;
[self.sourceArray addObject:dict];
dispatch_async(dispatch_get_main_queue(), ^
[self.view layoutIfNeeded];
);
];
界面细节-
Viewcontroller 包含 UIScrollView,其中包含使用动态数据的各种 UIView 和包含动态数据的 UITableView。
这就是我当前 UI 的样子。
【问题讨论】:
告诉我们您的 UI 是什么样的,以及您希望如何显示新下载的数据。如果没有这些信息,我们只能猜测。 @DuncanC UI 细节已添加。 【参考方案1】:对 layoutIfNeeded 的调用将触发您的视图检查它们是否需要更新其布局。更改数组的内容不会导致视图的布局需要更新,因此对 layoutIfNeeded 的调用不太可能执行任何操作。
为了让我们帮助您使用您加载的字典来更新您的 UI,您必须告诉我们您希望新数组元素对您的 UI 进行哪些更改。
一种常见的做法是在表格视图或collectionView 中显示数组的内容。在这种情况下,您将调用表格/集合视图的 reloadData()
函数,这将导致它询问其数据源的条目数并重新渲染它的所有单元格。
编辑
好的,您下载的数据和您的 UI 之间有什么关系?您编写的哪些代码应该会导致 UI 更新?您已经更改了数组,但没有显示任何代码来告诉您的视图对象有关更新的数据。
对于表格视图,这可能就像上面提到的调用reloadData
一样简单。对于其他视图,您的数据如何显示到这些视图中?应该用什么机制将新数据安装到这些视图中?
【讨论】:
绝对reloadData()
是这里所缺少的。
@brandonscript,仅当正在获取的数据应该显示到表格视图或集合视图中时。【参考方案2】:
让视图重新绘制自身的最简单方法是调用[UIView setNeedsDisplay]
或使用[UIView setNeedsDisplayInRect]
。这个方法告诉视图它需要重新绘制自己和它的子视图。但是,您不必总是调用它。还有其他方法可以导致视图自身重绘。例如,如果您使用 [UIView addSubview:]
或 [UIView removeFromSuperview]
在视图层次结构中添加或删除视图。
这些方法会导致系统调用您视图的 drawInRect: 方法(假设您使用自定义绘图代码覆盖它)。如果您没有为自定义绘图覆盖此方法,那么它应该会导致您的子视图收到相同的消息,以便它们有机会重绘。
这里有更多信息。具体阅读标有“视图绘图周期”的部分。
http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html
您可以在其中添加观察者并强制调用控制器重新加载的 *** 帖子之一 How to reload UIViewController
【讨论】:
【参考方案3】:你必须使用[tableView reloadData]
,如果需要的话
[self.view layoutSubviews];
[self.view setNeedsDisplay];
[self.view setNeedsLayout];
【讨论】:
以上是关于使用 RESTful API 时更新 UI的主要内容,如果未能解决你的问题,请参考以下文章