1

Xamarinのこのチュートリアルで説明したのと同じ方法で使用する UITableView があります。

サンプルの指示に従って、次のようにメソッドでcell.Accessoryを aに設定します。DetailDisclosureButtonGetCell

public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
{
     (Some code to create/style the cell, etc. See tutorial link.)
     cell.Accessory = UITableViewCellAccessory.DetailDisclosureButton;
}

がタップされたUIPopoverControllerときに表示するようにしたいと思います。DetailDisclosureButtonそのアンカーはボタンに「添付」する必要があります。

これを行うには、次のAccessoryButtonTappedように、それに応じてメソッドを変更する必要があります。

public override void AccessoryButtonTapped (UITableView tableView, NSIndexPath indexPath)
{
        uipoc = new UIPopoverController(uivc);
        uipoc.PopoverContentSize = new SizeF(200f, 300f);
        uipoc.PresentFromRect (tableView.CellAt (indexPath).AccessoryView.Frame, tableView, UIPopoverArrowDirection.Right, true);
}

Uipoc(まだ空) と同様に、クラス変数ですUIViewController uivc

私が理解しているように、PresentFromRectの最初のパラメーターは、UIPopoverController が「接続」する UIView を決定します。そのためには、そのビューの Frame プロパティが必要です。

残念ながら、上記の方法ではうまくいきません。に設定したcell.AccessoryViewにもかかわらず、常に nullです。cell.AccessoryDetailDisclosureButton

ここにリストされている回答は、プロパティにcell.Accessory影響を与えないことを示していcell.AccessoryViewます(ObjectiveCを扱っていることは知っていますが、MonoTouchにも同じことが当てはまると思います)。

DetailDisclosureButton代わりに、を に割り当てて、 を手動で追加することをお勧めしUIButtonます cell.AccessoryViewAccessoryButtonTappedただし、これは、Xamarin サンプルのメソッドを使用できないこと、独自のイベント ハンドラーを作成する必要があることなどを意味します。

別の方法として、セルの を循環Subviewsさせ、次のように popovercontroller を接続してみました。

uipoc.PresentFromRect (tableView.CellAt(indexPath).Subviews[1].Frame, tableView, UIPopoverArrowDirection.Right, true);

ただし、 and を使用するSubviews[0]Subviews[2]、まったく機能しませんが、奇妙な結果が得られます.どのセルのボタンがタップされてもSubviews[1]、ポップアップメニューは常にテーブルの最初のセルのすぐ隣に表示されます.DetailDisclosureButton

私の質問:が に設定されているDetailDisclosureButton場合、 のビュー (つまり、アクセサリのビュー) を取得する方法はありますか?cell.AccessoryUITableViewCellAccessory.DetailDisclosureButton

そうでない場合、後者のソリューション(UIButton手動で追加)が私が望むものを達成する唯一の方法ですか? C#/MonoTouch でこれを行うにはどうすればよいですか?

ありがとう!

4

1 に答える 1

2

いくつかいじった後、やや醜いが機能する回避策を見つけました:

public override void AccessoryButtonTapped (UITableView tableView, NSIndexPath indexPath)
{
    uipoc = new UIPopoverController(uivc);
    uipoc.PopoverContentSize = new SizeF(200f, 300f);
    uipoc.PresentFromRect (new RectangleF(cell.Frame.Right - 40f, cell.Frame.Y, cell.Frame.Width, cell.Frame.Height), tableView, UIPopoverArrowDirection.Right, true);
}

アクセサリの からの位置情報を必要とする代わりにFrame、それ自体の情報を使用してcell、右側から 40 を引きます。これにより、そのセルUIPopupViewcontrollerの の左側に が表示され、矢印がそれを指しています。DetailDisclosureButton明らかに、選択した次元に応じて、適切な次元として 40 を減算 (または加算) する必要がありUIPopoverArrowDirectionます。

これが正しい方法だとは思えませんが、誰かがより良い提案を思いつかない限り、私はそれに固執すると思います.

于 2012-10-08T14:02:28.353 に答える