菜鸟教程小白 发表于 2022-12-12 17:36:53

c# - 在我自己的 "UITableViewController"中使用默认实现使方法可选


                                            <p><p>我在 Xamarin.iOS 中编写了自己的 <code>UIViewController</code> 实现:</p>

<pre><code>public class HUDTableViewController : UIViewController, IUITableViewDataSource, IUITableViewDelegate, IDisposable
{
    private UITableView tableView;

    public UITableView TableView
    {
      get
      {
            return this.tableView;
      }
      set
      {
            this.tableView = value;
      }
    }

    public override void ViewDidLoad()
    {
      base.ViewDidLoad();

      this.tableView = new UITableView();
      this.tableView.TranslatesAutoresizingMaskIntoConstraints = false;

      this.tableView.WeakDelegate = this;
      this.tableView.WeakDataSource = this;

      UIView parentView = new UIView();
      parentView.AddSubview(this.tableView);
      View = parentView;

      NSMutableDictionary viewsDictionary = new NSMutableDictionary();
      viewsDictionary[&#34;parent&#34;] = parentView;
      viewsDictionary[&#34;tableView&#34;] = this.tableView;

      parentView.AddConstraints(NSLayoutConstraint.FromVisualFormat(&#34;H:||&#34;, (NSLayoutFormatOptions)0, null, viewsDictionary));
      parentView.AddConstraints(NSLayoutConstraint.FromVisualFormat(&#34;V:||&#34;, (NSLayoutFormatOptions)0, null, viewsDictionary));
    }

   
    public virtual System.nint NumberOfSections(UIKit.UITableView tableView)
    {
      throw new NotImplementedException();
    }

    public virtual System.nint RowsInSection(UIKit.UITableView tableview, System.nint section)
    {
      throw new NotImplementedException();
    }

    public virtual UIKit.UITableViewCell GetCell(UIKit.UITableView tableView, Foundation.NSIndexPath indexPath)
    {
      throw new NotImplementedException();
    }

   
    public virtual void RowSelected(UIKit.UITableView tableView, Foundation.NSIndexPath indexPath)
    {
      throw new NotImplementedException();
    }

   
    public virtual System.nfloat GetHeightForHeader(UIKit.UITableView tableView, System.nint section)
    {
      throw new NotImplementedException();
    }

   
    public virtual UIKit.UIView GetViewForHeader(UIKit.UITableView tableView, System.nint section)
    {
      throw new NotImplementedException();
    }

   
    public virtual void WillDisplay(UIKit.UITableView tableView, UIKit.UITableViewCell cell, Foundation.NSIndexPath indexPath)
    {
      throw new NotImplementedException();
    }
}
</code></pre>

<p>现在我想使用该类并从中派生。其中一个派生需要 <code>GetHeightForHeader</code> 和 <code>GetViewForHeader</code>,另一个不需要。不需要它的那个似乎也调用了这个函数,我得到 <code>NotImplementedException</code> 异常。</p>

<p>我不知道它触发了什么以便调用方法。我可以实现 <code>GetHeightForHeader</code> 并返回 <code>UITableView.AutomaticDimension</code>,但是我应该如何处理 <code>GetViewForHeader</code>?</p>

<p>我怎样才能使这个类足够灵活,以便所有派生都可以使用它并且只调用它们需要的方法?我应该在方法中放入什么而不是 <code>throw new NotImplementedException();</code>?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>根本不执行它们。我没有使用 Xamarin,但这些方法看起来来自 <code>IUITableViewDataSource</code> 和 <code>IUITableViewDelegate</code> - 这意味着它们在适当的时间由 TableView 调用。在 Cocoa 中,这两个协议(protocol)中只有两个方法被标记为必需,从您的示例中它将是这两个:</p>

<pre><code>public virtual System.nint RowsInSection(UIKit.UITableView tableview, System.nint section);
public virtual UIKit.UITableViewCell GetCell(UIKit.UITableView tableView, Foundation.NSIndexPath indexPath);
</code></pre>

<p>其余的完全是可选的,因此不需要默认实现,因为 TableView 已经知道如何处理它,当它们没有实现时。</p>

<p>从这些来看<a href="https://developer.xamarin.com/api/type/MonoTouch.UIKit.IUITableViewDataSource/" rel="noreferrer noopener nofollow">docs</a> ,似乎在 Xamarin 中的事情也很相似,因为只有提到的两个方法被标记为 <code>IsRequired=true</code>。</p>

<p>如果您坚持使用这些实现,那么您应该尽可能返回中性值。在这种情况下,什么是“中立”是另一回事,有待商榷。例如,标题高度可能是 <code>0</code>, View 可能是 <code>nil</code>,而单元格高度可能是 <code>44</code>。至少这些是 Cocoa 中的默认值。</p></p>
                                   
                                                <p style="font-size: 20px;">关于c# - 在我自己的&#34;UITableViewController&#34;中使用默认实现使方法可选,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/34224264/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/34224264/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: c# - 在我自己的 &#34;UITableViewController&#34;中使用默认实现使方法可选