我有一个要求,我最初有一个仅按日期/时间排序的消息列表。要求用户能够单击 UISegmentedControl(4 个按钮的列表)并能够将 UITableView 从直接列表更改为分组列表(即按消息类别分组)。
根据我的阅读,一旦在 UITableView 上设置了样式,您就无法更改它。那么满足这一要求的最佳方法是什么?杀死视图并以适当的样式重新创建?
并不是说它有很大的不同,我使用的是 Xamarin Studio 和 C#,针对 Mono 3.2.1 和 iOS 6+
我有一个要求,我最初有一个仅按日期/时间排序的消息列表。要求用户能够单击 UISegmentedControl(4 个按钮的列表)并能够将 UITableView 从直接列表更改为分组列表(即按消息类别分组)。
根据我的阅读,一旦在 UITableView 上设置了样式,您就无法更改它。那么满足这一要求的最佳方法是什么?杀死视图并以适当的样式重新创建?
并不是说它有很大的不同,我使用的是 Xamarin Studio 和 C#,针对 Mono 3.2.1 和 iOS 6+
而不是杀死视图并重新实例化,只需维护对两个UITableView
s 的引用,每个适当的类型之一。使用您的课程在它们之间切换Controller
。以下简单示例将切换按钮与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");
}
}