jjzjj

objective-c - 在 View Controller 中维护到 subview 的链接

coder 2024-01-21 原文

这是我的情况:我有一个管理 subview 层次结构的 UIViewController,可能如下所示:

此 View 是从 .xib 构建的。我希望能够保持对 topView 的每个 subview 的访问——也就是说,我想要一个指向每个 subview 的指针,这样我就可以,例如,说这样的话:

[button1 setText:@"Hello!"];

通常,为此,我会使用 Interface Builder 连接我想访问的每个元素,从而生成如下所示的 header :

@interface MyViewController : UIViewController
{
    __weak IBOutlet UIView *view;
    __weak IBOutlet UILabel *label;
    __weak IBOutlet UIButton *button1;
    __weak IBOutlet UIButton *button2;
}

@end

这些实例变量是 __weak,这很好,因为当我的 View Controller “获取”它们时,它们已经属于我的 View Controller 的 Root View (令人困惑的是,我标记为“topView”在我的快速图表中)。事实上,我希望这些引用是弱的——当我的 Root View 被释放时,它的所有 subview 也应该被释放。太好了。

但假设我想创建一个新的 UI 元素,也许是一个自定义按钮,完全在代码中。我将此元素称为 CustomViewClass,它是 UIView 的子类。我将创建的 CustomViewClass 实例将称为 customButton。对于我的 View 的其他 subview ,我希望“访问”customButton 以便我可以与其进行交互。然而,我知道,与任何其他 subview 一样,customButton 将归其父 View 所有,这就是它应该的样子——同样,我希望它在我的 View 被释放时被释放。这让我觉得我应该将此 View 声明为 __weak 实例变量或我的 View Controller 的属性。让我们这样做:

@interface MyViewController : UIViewController
{
    __weak IBOutlet UIView *view;
    __weak IBOutlet UILabel *label;
    __weak IBOutlet UIButton *button1;
    __weak IBOutlet UIButton *button2;
    __weak CustomViewClass *customButton;
}

@end

然后,在我的实现中:

@implementation MyViewController
- (void)viewDidLoad
{
    [super viewDidLoad];

    customButton = [[CustomViewClass alloc] init];
    [[self view] addSubview:customButton];
}
@end

您可能已经意识到,这是行不通的,编译器会发出警告以启动。像这样的东西:

Assigning retained object to weak variable; object 
will be released after assignment

我目前用一些非常糟糕的风格来躲避这种警告:

@implementation MyViewController
- (void)viewDidLoad
{
    [super viewDidLoad];

    CustomViewClass *customButtonLocal = [[CustomViewClass alloc] init];
    [[self view] addSubview:customButtonLocal];
    customButton = customButtonLocal;
}
@end

这样,我就得到了我想要的:

  1. 屏幕上的 CustomViewClass 实例...
  2. ...只有一个所有者,它的 super View ...
  3. ...并且没有挥之不去的变量(customButtonLocal 在 block 结束后立即释放)。

但这不是执行此操作的“正确”方法。所以,最后,我的问题是:

应该如何分配和实例化这个以编程方式创建的 __weak 变量而不使用这个中间人解决方法?

最佳答案

使 CustomViewClass *customButton 成为强引用。

您通常将 subview 的变量声明为 __weak IBOutlet 的原因是这些链接的存在并不意味着所有权。 subview 由从 NIB/Storyboard 实例化的对象拥有。您直接拥有该对象,您也间接拥有它的依赖对象。

customButton 是另一回事:您以编程方式创建它,因此您的 NIB/Storyboard 不拥有它。因此,您应该引用它 __strong(这是没有 ARC 修饰符时的默认设置)。

关于objective-c - 在 View Controller 中维护到 subview 的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11314392/

有关objective-c - 在 View Controller 中维护到 subview 的链接的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  4. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  5. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  6. ruby-on-rails - Prawn - 表格单元格内的链接 - 2

    我正在尝试用Prawn生成PDF。在我的PDF模板中,我有带单元格的表格。在其中一个单元格中,我有一个电子邮件地址:cell_email=pdf.make_cell(:content=>booking.user_email,:border_width=>0)我想让电子邮件链接到“mailto”链接。我知道我可以这样链接:pdf.formatted_text([{:text=>booking.user_email,:link=>"mailto:#{booking.user_email}"}])但是将这两行组合起来(将格式化文本作为内容)不起作用:cell_email=pdf.make_c

  7. objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错 - 2

    我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U

  8. ruby - 你会如何在 Ruby 中表达成语 "with this object, if it exists, do this"? - 2

    在Ruby(尤其是Rails)中,您经常需要检查某物是否存在,然后对其执行操作,例如:if@objects.any?puts"Wehavetheseobjects:"@objects.each{|o|puts"hello:#{o}"end这是最短的,一切都很好,但是如果你有@objects.some_association.something.hit_database.process而不是@objects呢?我将不得不在if表达式中重复两次,如果我不知道实现细节并且方法调用很昂贵怎么办?显而易见的选择是创建一个变量,然后测试它,然后处理它,但是你必须想出一个变量名(呃),它也会在内存中

  9. ruby - 在 Ruby 中,为什么 Array.new(size, object) 创建一个由对同一对象的多个引用组成的数组? - 2

    如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta

  10. ruby - 使用 Watir 检查错误链接 - 2

    我有一个未排序的链接列表,我将其保存在旁边,我想单击每个链接并确保它转到真实页面而不是404、500等。问题是我不知道该怎么做。是否有一些我可以检查的对象会给我http状态代码或任何东西?mylinks=Browser.ul(:id,'my_ul_id').linksmylinks.eachdo|link|link.click#needtocheckfora200statusorsomethinghere!how?Browser.backend 最佳答案 我的回答与铁皮人的想法类似。require'net/http'require'

随机推荐