• UISearchController(使用)


    效果图1

    效果图2

    其实一般是在第一种情况使用的UISearchController,但是第二种情况这种又懒得去用uisearchbar+uitableview等等去处理,

    其实主要是对数据源的合理使用即可

    UISearchController通常是用来排查数据的,比如当前的uitableviewcontroller有许多数据,排查之后需要更新显示数据。

    首先UISearchController是联通主cntroller与结果controller桥梁

    在主controller建立UISearchController对象

    @interface UIViewControllerLocation ()
    {
        UISearchController* searchController0;
    }

    那么如何联通主controller

        CGRect rectBar=CGRectMake(0, 0, self.view.frame.size.width, 44);

        [searchController0.searchBar setFrame:rectBar];

      
    [self.searchBar addSubview:searchController0.searchBar];

    以上代码需要理解的是searchController0.searchBar是一个只读属性,所以不能被assign,

    self.searchBar是一个view

    /**
     *  搜索框
     */
    @property (weak, nonatomic) IBOutlet UIView *searchBar;


    不能够直接使用(UISearchBar)self.searchBar=searchController0.searchBar;只有tableview.tableHeaderView=searchController0.searchBar才有效果,同样是view不知道为什么
    还有比较重要的一点就是,即使模拟器可以正常的显示,但是真机却无法显示searchBar(xcode7+iphone5s+ios8.3)
    最终调试得出真机运行时
    searchController0.searchBar的frame是(0 0,0 0)需要重置frame才可以正常显示
    
    

    那么如何联通结果controller

    @interface UIViewControllerLocation ()
    {
        SearchResult* searchResult;
    }
        searchResult=[SearchResult new];
        searchController0=[[UISearchController alloc] initWithSearchResultsController:searchResult];
    SearchResult是一个uitableviewcontroller
    然后是主controller作为了结果controller的数据更新者
        searchController0.searchResultsUpdater=self;

    需要遵循一个代理

    @interface UIViewControllerLocation : UIViewController<UISearchResultsUpdating>

    然后

         //设置活跃性为YES否则需要自行推送结果controller
        searchController0.active=YES;

    那么主controller如何推送数据到 结果 controller

    代理

    /**
     *  当搜索框开始改变时触发
     *
     *  @param searchController
     */
    -(void)updateSearchResultsForSearchController:(nonnull UISearchController *)searchController
    {
        searchResult.getResult(@[@70,@71,@72,@73,@74,@75]);
    }

    结果controller需要处理接受到的数据(使用的block)

    #import <UIKit/UIKit.h>
    #import "NSObjectDataSource.h"
    /**
     *  获取数据
     *
     *  @param idData
     */
    typedef void (^GetResult)(id idData);
    @interface SearchResult : UIViewController
    /**
     *  获取数据的block
     */
    @property(nonatomic,copy)GetResult getResult;
    /**
     *  查询数据列表
     */
    @property (weak, nonatomic) IBOutlet UITableView *tabelview;
    /**
     *  tableview的datasource代理
     */
    @property(nonatomic,retain)NSObjectDataSource* dataSource;
    @end

    主controller里初始化结果controller的获取数据block

        SearchResult*__weak weakSearchResult=searchResult;
        searchResult.getResult=^(NSArray* array)
        {
            weakSearchResult.dataSource.nsArrayModels=array;
            [weakSearchResult.tabelview reloadData];
        };

    在主controller里搜索更新时执行就可以了(只传递最终数据,数据的筛选需要自行处理)

     

     

     

  • 相关阅读:
    《将Pell方程进行到底》 回复
    《大家来讨论一下,我的文章被撤的概率是多少?》 回复
    Game of Taking Stones【威佐夫博弈】【高精度】
    《机器学习》第二次作业——第四章学习记录和心得
    《机器学习》第一次作业——第一至三章学习记录和心得
    DB tunning 1 索引调优
    SpringBoot 学习笔记1
    Exchanging Gifts 【拓扑】
    SpringBoot 学习笔记2
    Leetcode 刷题记录
  • 原文地址:https://www.cnblogs.com/louyizhidu/p/4977749.html
Copyright © 2020-2023  润新知