自iOS 8以来,是否有其他人在UITableViewCell中遇到了detailText标签的问题?
我有一个表格,其中包含文字和细节字符串.最初的详细文本是一个空字符串(@"").在将故事板segue执行到编辑屏幕后,我返回一个新的详细文本值并更新它.我尝试在viewWillAppear中重新加载表,以便在返回上一个视图后立即显示该值.
表格视图再次可见后,表格单元格已将文本字段向上移动以为详细文本腾出空间,但不显示任何明细文本.在我返回编辑屏幕并再次返回之前,文本不会显示.
我做了什么来排除故障:看起来我认为细节文本标签的自动布局没有正确更新,并且记录detailTextLabel框架的大小和构成证实了这一点.
我可以通过在viewDidAppear中运行[table reloadData]来强制更新文本,但是这会让我感觉不到我喜欢的闪烁效果,并且看起来不专业.
编辑:我做过的其他事情:我还强迫detailTextLabel使用[cell.detailTextLabel sizeToFit]重新调整自身大小.这导致它显示,但在单元格中以奇数方式偏移.再次进入编辑页面后,detailTextLabel会修复它的位置.
我已经创建了一个简单的项目作为github repo,以准确显示我正在处理的内容:
https://github.com/acidaris/ios8_table_issue
我正在使用的视图控制器的主要代码也在下面.
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.table reloadData];
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"];
cell.textLabel.text = @"This is a test";
cell.detailTextLabel.text = self.value;
CGRect frame = cell.detailTextLabel.frame;
NSLog(@"detailTextLabel x=%f y=%f width=%f height=%f",
frame.origin.x,frame.origin.y,frame.size.width,frame.size.height);
return cell;
}
Run Code Online (Sandbox Code Playgroud)
该单元格在StoryBoard中进行原型化,因此始终定义由dequeueReusableCellWithIdentifier:选择的单元格.此外,故事板中的单元格类型设置为字幕,如果定义了初始值,它会显示.
如果有人能帮我解决这个问题,我将非常感激.
如果要对UITableViewCell进行子类化,则可以在布局完成后修改detailTextLabel的框架.这就是我所做的,它似乎有效,但在6加上,我在textLabel和detailTextLabel之间得到了一个奇怪的分界线.编辑:(我已经调整了这个.)我不喜欢这个解决方案,但到目前为止,这是我遇到的最好的.它在呈现视图后不会更新,并且相对简单.如上所述,我将继续寻找更好的解决方案.
- (void)layoutSubviews {
[super layoutSubviews];
CGRect textFrame …Run Code Online (Sandbox Code Playgroud) 在iOS 5.1和iOS 5.0中它可以工作,但在iOS 6.0中键盘不显示.
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
UITextField *textField = self.emailAddressTextField;
[textField becomeFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)
现在我把逻辑移到了-viewDidAppear:.
// This works but is not desirable.
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UITextField *textField = self.emailAddressTextField;
[textField becomeFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)
这有效,但不可取.在加载视图后显示键盘上滑动画.
我希望键盘能够出现,因为从左到右的动画显示了导航控制器中加载的视图.
有人知道如何在iOS 6中显示视图时加载键盘吗?
更新
根据@ Duck的反馈,我做了一些测试.这似乎特定于UITableViewCells中包含的UITextFields.
有没有人有什么建议?
第一个解决方案
所以完整的描述.这是一个带有两个静态单元格(电子邮件和密码)的表格视图.视图中有一个分配了页脚视图的登录按钮.这两个单元格中包含一个文本字段,并且是自定义类型SICOTextFieldCell.
我的解决方案是在登录按钮后面放置一个假文本字段(在表格页脚视图中).
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
UITextField *textField = self.SICO_fakeTextField;
[textField becomeFirstResponder];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UITextField *textField = self.SICO_emailAddressTextField;
[textField becomeFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)
新解决方案
基于@stm的答案,我提出了一个新的(优越的?)解决方案.
我的解决方案是致电-selectRowAtIndexPath:animated:scrollPosition:.-[SICOTextFieldCell setSelected:animated:] …
我有一个标准的SingleViewApplication项目.
ViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
println("viewDidLoad");
}
}
Run Code Online (Sandbox Code Playgroud)
当我启动应用程序时,将调用viewDidLoad.
我的方案:
- 按Home键(applicationDidEnterBackground)
- 调用应用程序(applicationWillEnterForeground)
并且不调用viewDidLoad.
还有另一个功能要覆盖吗?
是否有BOOL或其他方式知道viewDidLoad:是否已被调用?
每次我的视图进入活动状态时,我都需要更改视图属性,但如果视图尚未加载,我不想过早地触发viewDidLoad:.如果没有方法轻易告诉viewDidLoad:是否已被调用,我只需在视图控制器init 中将一个名为loaded set 的BOOL添加到NO,然后在输入active后更改视图属性(如果已加载为YES)或在viewWillAppear中:如果加载为NO,则将加载设置为YES.
在iOS 4.x或更低版本中,viewDidAppear和viewWillAppear,viewDidDisappear和viewWillDisappear,此类ViewController的委托方法未被调用.相同的方法适用于iOS 5.x.
为什么?这是iOS 4.x或更低版本中的错误.因为在iOS 5.x中,所有这些方法都以适当的方式和顺序被调用.
先谢谢,Mrunal
我有一个相当简单的应用程序与2"布局"使用SharedPreferences.
Main有一个textView,它使用来自SharedPreferences的getString.还有一个用于打开设置的按钮.
设置有一个微调器和一个保存到SharedPreferences的按钮.
应用程序加载时,textView会更新,因为我在onCreate(Bundle savedInstanceState)中调用setText()
当我打开设置并更新SharedPreferences时,我使用Back按钮返回Main.
由于我在onCreate()中调用setText(),因此在退出应用程序并再次将应用程序打开到main之前,textView不会再次更新.
从"设置"返回后,我需要使用哪种方法来更新textView?
我的请求类似于iOS的viewWillAppear().
在我的标签栏中,我有四个视图控制器,一个中发生的事情会影响另一个视图,所以我可能需要在视图控制器可见时重新加载一些元素.通常我会通过实现viewWillAppear来解决这个问题,但是当我在选项卡之间切换时,似乎没有调用viewWillAppear.我该如何解决这个问题,或者我应该做些什么呢?
更新:作为PS我应该补充一点,这是一个导航控制器层次结构中的tabbarcontroller
干杯
聂
cocoa-touch uitabbarcontroller uiviewcontroller viewwillappear
我一直认为打电话[super viewWillAppear:animated]是强制性的.但是今天我从Apple的示例应用程序中看到了一段代码CoreDataBooks,这里的代码来自viewWillAppear:于:
- (void)viewWillAppear
{
[self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)
请注意,没有超级电话.这让我很困惑.如果连Apple的代码都没有包含调用[super viewWillAppear:]那么也许我总能省略它?或者也许有关于这个问题的某些规则?任何人都可以解释一下吗?
我正在向父视图控制器添加子视图控制器,并且一切都按预期工作,除了子视图控制器没有触发其通常的回调.例如,从未调用像viewWillAppear(动画)这样的东西.我调查了一下,并认为这可能是因为我没有在子视图控制器上分别将它添加到父视图之前和之后调用willMoveToParentViewController和didMoveToParentViewController.不幸的是,修复没有任何区别.有没有人知道如何连接它,以便当我执行addChildViewController和removeChildViewController时,会触发常规回调?添加childViewController后,我还将其视图作为子视图添加到父视图控制器的视图中.在任何一点(addChildViewController和addSubview)都会调用子视图控制器的viewWillAppear(动画)等方法...
缺口
作为概述,每当从堆栈中弹出视图时,我都会遇到UITabBarController内部的UINavigationController问题,并调用viewWillAppear.
从委托中,以编程方式创建UITabBarController:
// Create views for Tab Bar
UINavigationController *view1 = [[UINavigationController alloc] initWithRootViewController:[[newsFeedNavigationController alloc] initWithStyle:UITableViewStylePlain]];
resizedTabBatItem *tabBarItem1 = [[resizedTabBatItem alloc] initWithTitle:nil image:[UIImage imageNamed:@"newspaper.png"] tag:0];
[view1 setTabBarItem:tabBarItem1];
[tabBarItem1 release];
UIViewController *view2 = [UIViewController new];
resizedTabBatItem *tabBarItem2 = [[resizedTabBatItem alloc] initWithTitle:nil image:[UIImage imageNamed:@"speechbubble.png"] tag:1];
[view2 setTabBarItem:tabBarItem2];
[tabBarItem2 release];
....
// Create the tab bar controller
bookTabBarController = [BookTabBarController new];
[[bookTabBarController view] setFrame:CGRectMake(0, 0, 320, 460)];
// Add the views to it
NSArray *viewControllers = [NSArray arrayWithObjects:view1, view2, view3, view4, view5, nil]; …Run Code Online (Sandbox Code Playgroud) viewwillappear ×10
ios ×6
cocoa-touch ×2
iphone ×2
objective-c ×2
uitableview ×2
android ×1
autolayout ×1
delegates ×1
ios4 ×1
ios5 ×1
ios6 ×1
oncreate ×1
swift ×1
textview ×1
uitextfield ×1
viewdidload ×1