将UITableView从列表切换到分组的最佳方法是什么?

时间:2013-08-26 17:39:21

标签: c# ios uitableview xamarin.ios xamarin

我有一个要求,我最初有一个仅按日期/时间排序的消息列表。要求用户是否能够单击UISegmentedControl(4个按钮的列表)并能够将UITableView从直接列表更改为分组列表(即按消息类别分组)。

根据我的阅读,一旦在UITableView上设置了样式,你就无法改变它。那么满足这一要求的最佳方法是什么?杀死视图并使用适当的样式重新创建?

不是它有很大的不同,我使用的是Xamarin Studio和C#,目标是Mono 3.2.1和iOS 6 +

1 个答案:

答案 0 :(得分:4)

不是杀死视图并重新实例化,而是仅维护对两个UITableView的引用,每个Controller s是适当类型之一。使用UIView课程在它们之间切换。下面的简单示例将切换按钮放在与表相同的public class ChangeableSource : UITableViewSource { public bool Grouped { get; set; } public override int NumberOfSections(UITableView tableView) { if(Grouped) { return 4; } else { return 1; } } public override int RowsInSection(UITableView tableview, int section) { return 3; } public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) { var cell = tableView.DequeueReusableCell("Default"); if(cell == null) { cell = new UITableViewCell(UITableViewCellStyle.Default, "Default"); } cell.TextLabel.Text = String.Format("IndexPath {0} {1}", indexPath.Section, indexPath.Row); return cell; } } public class ToggleTableView : UIView { UITableView ungroupedView; UITableView groupedView; ChangeableSource changeableSource; public void SetStyle(bool grouped) { changeableSource.Grouped = grouped; if(changeableSource.Grouped) { ungroupedView.RemoveFromSuperview(); AddSubview(groupedView); } else { groupedView.RemoveFromSuperview(); AddSubview(ungroupedView); } } public bool GetStyle() { return changeableSource.Grouped; } public ToggleTableView() { var btn = new UIButton(new RectangleF(10, 10, 150, 40)); btn.SetTitle("Change", UIControlState.Normal); btn.TouchUpInside += (s,e) => ToggleStyle(this, new EventArgs()); var tvFrame = new RectangleF(0, 60, UIScreen.MainScreen.Bounds.Width, UIScreen.MainScreen.Bounds.Height - 60); ungroupedView = new UITableView(tvFrame, UITableViewStyle.Plain); groupedView = new UITableView(tvFrame, UITableViewStyle.Grouped); AddSubview(btn); AddSubview(ungroupedView); changeableSource = new ChangeableSource(); changeableSource.Grouped = false; ungroupedView.Source = changeableSource; groupedView.Source = changeableSource; } public event EventHandler<EventArgs> ToggleStyle = delegate {}; } public class TogglingTableController : UIViewController { public TogglingTableController() : base () { } public override void DidReceiveMemoryWarning() { // Releases the view if it doesn't have a superview. base.DidReceiveMemoryWarning(); } public override void ViewDidLoad() { base.ViewDidLoad(); var view = new ToggleTableView(); view.ToggleStyle += (s,e) => { view.SetStyle(! view.GetStyle()); }; this.View = view; } } [Register ("AppDelegate")] public class AppDelegate : UIApplicationDelegate { UIWindow window; TogglingTableController viewController; public override bool FinishedLaunching(UIApplication app, NSDictionary options) { window = new UIWindow(UIScreen.MainScreen.Bounds); viewController = new TogglingTableController(); window.RootViewController = viewController; window.MakeKeyAndVisible(); return true; } } public class Application { static void Main(string[] args) { UIApplication.Main(args, null, "AppDelegate"); } } 中,这可能不合适,但是显示了该技术:

{{1}}