2

我正在使用 MT.D 列出 DialogViewController 中的人员。EnableSearch 已打开,您可以过滤列表中的项目。但是,如果你推到另一个视图,然后回来,搜索栏是空的。我能够通过覆盖OnSearchTextChanged (string text)字符串并将其存储到本地字段来恢复使用的搜索查询,当视图重新成为焦点时,我使用以下代码:

public override ViewDidAppear (bool animated)
{
    base.ViewDidAppear (animated);
    if (EnableSearch && !string.IsNullOrWhiteSpace (lastSearchQuery))
    {
        this.SearchButtonClicked (lastSearchQuery); // this inserts text
        this.StartSearch (); // no clue what this is doing
        this.ReloadData (); // does nothing but was worth a try
    }
}

该代码将文本插入搜索栏中并显示它,但除非您输入某些内容,否则我无法过滤它。键盘出现在视野中,并且有一个搜索按钮,但它什么也没做。有什么建议么?

4

1 回答 1

5

我认为您所缺少的只是调用 DialogViewController 上的 PerformFilter。

我输入了一个快速示例来显示行为。我从来没有看到你观察到的确切行为。我不必重新填充搜索字段。作为参考,我使用的是 Monotouch 5.2.11。

using System;
using System.Linq;
using MonoTouch.UIKit;
using MonoTouch.Dialog;
using MonoTouch.Foundation;

namespace delete201204242A
{
    [Register ("AppDelegate")]
    public partial class AppDelegate : UIApplicationDelegate
    {
        UIWindow _window;
        UINavigationController _nav;
        MyDialogViewController _rootVC;

        public override bool FinishedLaunching (UIApplication app, NSDictionary options)
        {
            _window = new UIWindow (UIScreen.MainScreen.Bounds);

            RootElement _rootElement = new RootElement ("LINQ root element") {
                new Section ("List") {
                    from x in new Expense [] { new Expense () {Name="one"}, new Expense () {Name="two"}, new Expense () {Name="three"} }
                    select (Element)new BindingContext (null, x, x.Name).Root
                }
            };

            _rootVC = new MyDialogViewController (_rootElement);
            _rootVC.EnableSearch = true;
            _nav = new UINavigationController (_rootVC);

            _window.RootViewController = _nav;

            _window.MakeKeyAndVisible ();

            return true;
        }

        public class MyDialogViewController : DialogViewController
        {
            public MyDialogViewController (RootElement root) : base (root) {}

            public string SearchString { get; set; }            
            public override void ViewDidAppear (bool animated)
            {
                base.ViewDidAppear (animated);
                if (!string.IsNullOrEmpty (SearchString))
                    this.PerformFilter (SearchString);
            }
            public override void OnSearchTextChanged (string text)
            {
                base.OnSearchTextChanged (text);
                SearchString = text;
            }
        }

        public class Expense
        {
            [Section("Expense Entry")]

            [Entry("Enter expense name")]
            public string Name;
            [Section("Expense Details")]

            [Caption("Description")]
            [Entry]
            public string Details;
        }

    }
}
于 2012-04-25T05:11:31.593 回答