我有一个自定义的 UITableViewCell,其中包含一个用于就地编辑的 UITextField。当 UITableView 处于编辑模式时,应启用 cell 的 字段,但在显示单元格的删除确认时不。
我将 UITableViewCell 子类化并覆盖了它的 willTransitionToState 方法:
- (void)willTransitionToState:(UITableViewCellStateMask)state {
[super willTransitionToState:state];
self.nameField.enabled = !(state & UITableViewCellStateShowingDeleteConfirmationMask)
&& (state & UITableViewCellStateEditingMask);
}
我已经完成了 90%。
“willTransitionToState”在用户按下单元格的“-”按钮后被调用。显示删除确认,并根据需要禁用我的文本字段。但是,如果用户决定不删除单元格并通过向右滑动隐藏删除确认怎么办? 在这种情况下,不会调用“willTransitionToState”。
结果,我的文本字段卡在了禁用状态,即使在隐藏删除确认时应该启用它。您可能会认为,鉴于存在“UITableViewCellStateShowingDeleteConfirmationMask”标志这一事实,“willTransitionToState”将被对称调用,但事实似乎并非如此。
似乎 UITableViewCell 的“showingDeleteConfirmation”属性总是给出正确的结果。所以理论上我可以遍历调用“showingDeleteConfirmation”的每个单元格并相应地启用或禁用每个文本字段。这是低效和笨拙的。我正在考虑提交关于“willTransitionToState”的错误报告,但我需要更多数据点。有没有其他人遇到过这个问题?
Apple 确认这是一个错误。截至今天,错误报告仍然开放。
最佳答案
为 KVO 声明上下文:
static int KVOContext;
使用自定义 getter 获取单元格中的 scrollView:
- (UIScrollView *)scrollViewToObserve
{
UIView *view = self.subviews[0];
return (view != nil && [view isKindOfClass:[UIScrollView class]]) ? (UIScrollView *)view : nil;
}
将观察者添加到scrollView的contentOffset:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
[self.scrollViewToObserve addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:&KVOContext];
}
return self;
}
在dealloc中删除观察者:
- (void)dealloc
{
[self.scrollViewToObserve removeObserver:self forKeyPath:@"contentOffset" context:&KVOContext];
}
使用 KVO 来观察 contentOffset 的变化,但是使用 showingDeleteConfirmation 来观察 enabled 状态:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == &KVOContext) {
if ([keyPath isEqualToString:@"contentOffset"]) {
self.textField.enabled = !self.showingDeleteConfirmation;
}
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
警告: View 层次结构可能会在未来的更新中发生变化
关于ios - willTransitionToState (UITableViewCell) 在某些情况下不被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20119323/
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案