菜鸟教程小白 发表于 2022-12-12 21:12:32

ios - 如何从 UITableViewCell 推送新 Controller


                                            <p><p>我有两个类。一个用于<code>ItemController</code>(扩展<code>UITableViewController</code>),另一个用于<code>ItemCell</code>(扩展'UITableViewCell')。 </p>

<p>当点击每个单元格时,我会从 <code>ItemController</code> 的 <code>didSelectRowAtIndexPath</code> 中推送一个新 Controller 。 </p>

<p>另外,在 <code>ItemCell</code> 中,我有几个小按钮,每个单元格都有不同的 <code>tag</code>。当点击这些按钮中的任何一个时,我想插入一个新的 Controller 。我怎样才能做到这一点? </p>

<p><code>self.navigationController.pushViewController</code> 来自 <code>ItemCell</code> 不起作用,因为它没有 <code>navigationController</code></p>

<p>我希望在 RubyMotion 中看到解决方案,但如果没有,那也很好 :)</p>

<p><strong>编辑</strong></p>

<p>我读过 <code>delegate</code> 可以是一个解决方案,但我不知道如何实现它。这就是我所做的</p>

<p>项目 Controller :</p>

<pre><code>def tableView(table_view, cellForRowAtIndexPath: index_path)
    data_row = self.data
    cell = table_view.dequeueReusableCellWithIdentifier(CATEGORY_CELL_ID) || begin
      rmq.create(ItemCell.initWithSomething(self), :category_cell, reuse_identifier: CATEGORY_CELL_ID).get
    end
    cell.update(data_row)
    cell
end
</code></pre>

<p>项目单元:</p>

<pre><code>class ItemCell &lt; UITableViewCell

attr_accessor :delegate
def initWithSomething(delegate)
    @delegate = delegate
end

...use @delegate to push the new controller
end
</code></pre>

<p>但我得到一个错误</p>

<blockquote>
<p>item_controller.rb:114:in <code>tableView:cellForRowAtIndexPath:&#39;:
undefined method</code>initWithSomething&#39; for ItemCell:Class
(NoMethodError)</p>
</blockquote></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>一般的想法是你的单元应该告诉你的 ViewController 发生了什么事,而不是 ViewController 决定推送另一个 ViewController 。</p>

<p>您可以使用委托(delegate)设计模式做到这一点:</p>

<p><code>ItemCell</code> 具有符合协议(protocol)的 <code>delegate</code> 属性。例如</p>

<pre><code>@class ItemCell
@protocol ItemCellDelegate
- (void)itemCellDidClickSubmitButton:(ItemCell *)cell;
@end

@interface ItemCell
@property (nonatomic, weak) id&lt;ItemCellDelegate&gt; delegate
...
@end
</code></pre>

<p>在 <code>tableView:cellForRowAtIndexPath:</code> 中,您将 Controller 设置为单元格委托(delegate)(显然 ViewController 应符合 <code>ItemCellDelegate</code>):</p>

<pre><code>cell.delegate = self
</code></pre>

<p>单元格上的按钮将触发单元格本身的 IBAction,进而调用委托(delegate)方法</p>

<pre><code>- (IBAction)submitButtonTapped:(id)sender
{
    id &lt;ItemCellDelegate&gt; delegate = self.delegate;
    if () {
      ;
    }
}
</code></pre>

<p>显然,在您的 ViewController 中,您应该执行以下操作:</p>

<pre><code>#pragma mark - ItemCellDelegate

- (void)itemCellDidClickSubmitButton:(ItemCell)cell
{
    UIViewController *controller = // Create the view controller to push
    ;
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何从 UITableViewCell 推送新 Controller ,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/22867010/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/22867010/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何从 UITableViewCell 推送新 Controller