我想在完成表演后滚动到UITableView的底部 [self.tableView reloadData]
我原本有
[self.tableView reloadData]
NSIndexPath* indexPath = [NSIndexPath indexPathForRow: ([self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1) inSection: ([self.tableView numberOfSections]-1)];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
Run Code Online (Sandbox Code Playgroud)
但后来我读了reloadData是异步的,所以滚动不因为发生self.tableView,[self.tableView numberOfSections]并且[self.tableView numberOfRowsinSection都是0.
谢谢!
有什么奇怪的是我正在使用:
[self.tableView reloadData];
NSLog(@"Number of Sections %d", [self.tableView numberOfSections]);
NSLog(@"Number of Rows %d", [self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1);
Run Code Online (Sandbox Code Playgroud)
在控制台中它返回Sections = 1,Row = -1;
当我完成相同的NSLogs时,cellForRowAtIndexPath我得到Sections = 1和Row = 8; (8是对的)
我有一个UItableview,它从数组和下拉列表中填充.如果我选择任何下拉列表行,则将插入具有新值的数组,并且应重新加载tableview.如何使用新的数组内容为tableview设置动画?提前致谢
动画,我想逐一显示行.我尝试过这种方法
- (void)reloadRowsAtIndexPaths:(NSArray )indexPaths withRowAnimation:(UITableViewRowAnimation)animation {
NSIndexPath rowToReload = [NSIndexPath indexPathForRow:[names count] inSection:0];
NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil];
[tableDetails reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone];
}
Run Code Online (Sandbox Code Playgroud) CGPoint offset = [_table contentOffset];
[_table reloadData];
[_table setContentOffset:offset animated:NO]; //unuseful
// __block UITableView *tableBlock = _table;
// [self performBlock:^(id sender) {
// [tableBlock setContentOffset:offset];
// } afterDelay:2];
Run Code Online (Sandbox Code Playgroud)
我知道不知道任何被调用的委托方法reloadData.使用afterDelay:2哪种黑客可能太短或太长,所以我该如何实现呢?
我已经多次看过这个问题,但令人惊讶的是,我没有看到一致的答案,所以我会自己尝试一下:
如果你有一个包含你自己的自定义UITableViewCells的tableview,它包含UITextViews和UILabels,其高度必须在运行时确定,你应该如何确定heightForRowAtIndexPath中每一行的高度?
最明显的第一个想法是通过计算并然后对cellForRowAtIndexPath内单元格内每个视图的高度求和来计算每个单元格的高度,并存储该最终总高度以供以后检索.
但这不起作用,因为cellForRowAtIndexPath被称为AFTER heightForRowAtIndexPath.
我唯一能想到的是在viewDidLoad中进行所有计算,然后创建所有UITableViewCells,计算单元格高度并将其存储在UITableViewCell子类内的自定义字段中,并将每个单元格放在NSMutableDictionary中,其中indexPath为键,然后使用cellForRowAtIndexPath和heightForRowAtIndexPath中的indexPath从字典中检索单元格,返回自定义高度值或单元格对象本身.
这种方法似乎是错误的,因为它没有使用dequeueReusableCellWithIdentifier,而是我将所有单元格一次加载到我的控制器中的字典中,并且委托方法只是从字典中检索正确的单元格.
我没有看到任何其他方法来做到这一点.这是一个坏主意 - 如果是这样,这样做的正确方法是什么?
我有一个关于更新我的TableView的棘手问题,我使用不同的更新方法得到不同的结果,让我解释一下:
情况1:
我用[tbl reloadData];哪里tbl是我的TableView,以更新的TableView -按预期工作.
情况2: 我使用:
[tbl beginUpdates];
[tbl reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationRight];
[tbl endUpdates];
Run Code Online (Sandbox Code Playgroud)
tbl我的TableView 在哪里,indexPaths是一个包含TableView中存在的所有indexPath的数组.现在数组很好,它包含所有正确的indexPaths(双重和三重检查)但由于某种原因 - 这不能按预期工作.
现在我意识到这是一个XY问题(我问Y但我的问题确实是X因为我认为解决Y会解决X)而这只是因为我觉得解释X有点复杂(上述问题的结果)以一种简单的方式,所以如果可能的话,我宁愿避免这样做.
那么,直到我的问题:更新TableView的两种方式之间是否存在差异(当然除了动画位)或者我是否应该怀疑问题在其他地方?
编辑: 好的,我会尝试解释症状是什么:
在cellForRowAtIndexPath-method中,我为每个单元格添加一个按钮,其中指定的标签等于单元格的indexPath行,如下所示:
btn.tag = indexPath.row;
Run Code Online (Sandbox Code Playgroud)
我这样做的原因是我可以识别每个按钮,因为它们都调用相同的功能:
- (void)btnPressed:(id)sender
Run Code Online (Sandbox Code Playgroud)
当我然后更新单元格 - 因为单元格中的某些值已经改变 - 情境1使一切正常,情况2然而 - 混合标签,以便下次按下其中一个按钮时,它们不再具有正确的标签.
混音对我来说确实是随机的,但随机化的发生方式也不同,这取决于我先按哪个单元格按钮.我希望这能澄清我的问题.
我在xcode中的iOS应用程序有点问题.我有一个UITableView加载几百个单元格.当我向下滚动到特定单元格并向下钻取到详细视图控制器并再次返回时,主视图表一直返回到顶部.我看过以下两个相似的问题.
我仍然无法让这些工作.我不是最有经验的编码员,所以我真的很挣扎.
我知道像viewWillDisappear和viewDidAppear这样的东西需要改变,但我真的不能比这更进一步.
在此表中,我有一个reloadData功能,因此可以从服务器和工作搜索栏中下载最新数据.
无论如何,伸出援助之手会很棒.谢谢,
卢克
我相信我遇到了一个问题,我的闭包发生在后台线程上,而我的UITableView的更新速度不够快.我正在调用一个REST服务,在我的关闭中我有一个tableView.reloadData()电话,但这需要几秒钟才能完成.如何使数据重新加载速度更快(可能在主线程上?)
REST查询功能 - 使用SwiftyJSON库进行解码
func asyncFlightsQuery() {
var url : String = "http://127.0.0.1:5000/flights"
var request : NSMutableURLRequest = NSMutableURLRequest()
request.URL = NSURL(string: url)
request.HTTPMethod = "GET"
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse!, networkData: NSData!, error: NSError!) -> Void in
var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil
// Parse with SwiftyJSON
let json = JSON(data: networkData)
// Empty out Results array
self.resultArray = []
// Populate Results Array
for (key: String, subJson: JSON) in json["flights"] {
print ("KEY: \(key) ")
print (subJson["flightId"]) …Run Code Online (Sandbox Code Playgroud) 我有一个简单的应用程序,当用户键入时,可以用XML下载搜索结果UISearchBar.下载+解析是线程化的,一旦完成它就会触发一个NSNotification告诉ViewController的表视图[tableView reloadData];
以下是在结果出现时接收通知的代码:
- (void)receivedResults:(id)notification {
results = [notification object];
DLog(@"Received %i results",[results count]);
[[self tableView] reloadData];
}
Run Code Online (Sandbox Code Playgroud)
我得到日志输出"Received 4 results",但表格视图不会重新加载数据,直到我滚动/拖动几个像素.我正在使用内置的UITableViewCellStyleSubtitle单元格样式,而且我不会改变高度或者用表视图来表达任何奇特的东西.
我究竟做错了什么?
我有用目标编写的代码cI想要将此代码转换为swift3代码.
[_expandableTableView reloadSections:[NSIndexSet indexSetWithIndex:gestureRecognizer.view.tag] withRowAnimation:UITableViewRowAnimationAutomatic];
Run Code Online (Sandbox Code Playgroud)
使用在线工具转换后,它给了我下面的代码,但它不起作用
expandableTableView.reloadSections(IndexSet(index: gestureRecognizer.view!.tag), with: .automatic)
Run Code Online (Sandbox Code Playgroud)
请告诉我怎么做?
有没有人知道如何在显示集合视图时重新加载/刷新UICollectionView?基本上我正在为UITableview寻找类似于标准reloadData方法的东西.