Swift3.0 今日(TodayExtension)扩展图文笔记

>图片1(创建今日扩展)

>图片2

 >图片3(设置大小)

 >图片4(绘画控件)

>图片5(设置共享文件)

 >图片6(设置群组ID)

>图片7(设置URL Schemes)

>扩展中的主要逻辑代码

class TodayViewController: UIViewController, NCWidgetProviding,UITableViewDelegate,UITableViewDataSource {
    @IBOutlet weak var tableView: UITableView!

    var newsList = [NewsModel]()
    lazy var moreBtn:UIButton = {

        let btn = UIButton(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: 44))
        btn.setTitle("查看更多", for:.normal)
        btn.addTarget(self, action: #selector(gotoMainApp), for: .touchUpInside)
        btn.backgroundColor = UIColor(red:245/255.0, green:74/255.0, blue:48/255.0, alpha: 1)
        return btn

    }()

    func gotoMainApp(){
        //跳转到主程序的代码(见图7)
        self.extensionContext?.open(URL(string:"WidgetApp://action=GotoNewsListPage")!, completionHandler: { (suc:Bool) in

        })
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        updateView()
    }

    //刷新界面
    func updateView(){
        if newsList.count != 0{
            newsList.removeAll()
        }
        //通过UserDefaults从组里面获取共享数据(见图6)
        let ud = UserDefaults(suiteName: "group.centaHouse");
        if let nickName = ud?.array(forKey: "group.centaHouse.centaToday"){
            for (_,element) in nickName.enumerated() {
                if let edic = element as? [String : Any]{
                    let nm = NewsModel()
                    nm.setValuesForKeys(edic)
                    newsList.append(nm)
                }
            }

             self.tableView.reloadData()
            if newsList.count != 0 {
                self.tableView.tableFooterView = self.moreBtn
            }

            //判断在不同数据下展示界面的视图大小(不处理的话,展开和折叠会出问题)
            if #available(iOSApplicationExtension 10.0, *) {
                if extensionContext?.widgetActiveDisplayMode == .compact{ //压缩状态
                    //                    if newsList.count != 0 {
                    //                        UIView.animate(withDuration: 0.1, animations: {
                    //                            self.preferredContentSize = CGSize(width: self.view.bounds.width, height: CGFloat(self.newsList.count*100 + 44))
                    //                        })
                    //                    }
                }else{//展开状态
                    if newsList.count != 0 {
                        UIView.animate(withDuration: 0.1, animations: {
                            self.preferredContentSize = CGSize(width: self.view.bounds.width, height: CGFloat(self.newsList.count*100 + 44))
                        })
                    }
                }
            } else {
                // Fallback on earlier versions
            }

        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.delegate = self
        self.tableView.dataSource = self
        //注册自定义cell
        let nib = UINib(nibName: "NewsInfoCell", bundle: nil)
        self.tableView.register(nib, forCellReuseIdentifier: "NewsInfoCell")

        //设置今日扩展模式为可张开收缩模式(IOS10以后支持,进入扩展右上角显示"展开"和"折叠")
        if #available(iOSApplicationExtension 10.0, *) {
            self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded
        } else {
            // Fallback on earlier versions
        };

    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return newsList.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //新闻列表
        let cell  = tableView.dequeueReusableCell(withIdentifier: "NewsInfoCell") as! NewsInfoCell
        cell.news = newsList[indexPath.row]
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        let url = newsList[indexPath.row].ShowNewsUrl
        extensionContext?.open(URL(string:"WidgetApp://action=Goto-\(url)")!, completionHandler: { (suc:Bool) in

        })
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 95;
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //监听扩展的展开和收缩状态处理视图的大小
    /**
     * @maxSize 界面能够显示的最小和最大尺寸(最小状态下是110)
     * @activeDisplayMode: 张开和收缩状态
     **/
    @available(iOSApplicationExtension 10.0, *)
    func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
        if(activeDisplayMode == .compact){
            self.preferredContentSize = CGSize(width: maxSize.width, height: maxSize.height)
        }else{
            self.preferredContentSize = CGSize(width: maxSize.width, height: CGFloat(newsList.count*100 + 44))
        }
    }

    //自行看官方注释
    func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {
        // Perform any setup necessary in order to update the view.

        // If an error is encountered, use NCUpdateResult.Failed
        // If there‘s no update required, use NCUpdateResult.NoData
        // If there‘s an update, use NCUpdateResult.NewData

        if #available(iOSApplicationExtension 10.0, *) {
            if extensionContext?.widgetActiveDisplayMode == .compact{
                completionHandler(NCUpdateResult.newData)
            }else{
                completionHandler(NCUpdateResult.noData)
            }
        } else {
            // Fallback on earlier versions
            completionHandler(NCUpdateResult.newData)
        }

    }

}
#pragma mark  app跳转 (今日通知栏)
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{

    NSString* prefix = @"WidgetApp://action=";
    if ([[url absoluteString] rangeOfString:prefix].location != NSNotFound) {
        NSString* action = [[url absoluteString] substringFromIndex:prefix.length];
        if ([action isEqualToString:@"Goto-"]) {
        ......
        }else{
         ......
        }
    }
    return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
//在主程序保存需要展示的数据
func extentionUpdate(){
        //group.cenXXX 组名
        if let user =  UserDefaults(suiteName: "group.cenXXX") {
            //扩展标识符
            user.set(objArray, forKey: "group.cenXXX.cenToday")
        }
    }

>收缩状态

>展开状态

  

  

时间: 2025-01-05 00:12:54

Swift3.0 今日(TodayExtension)扩展图文笔记的相关文章

swift3.0的改变

Swift在这2年的时间内,发展势头迅猛,在它开源后,更是如井喷一样,除了 iOS.mac 平台,还支持了 Linux. 而今年下半年, Swift 3.0 也会随之发布.https://github.com/apple/swift-evolution详细介绍了3.0的特性. 这个版本的主要目标增强语言的二进制接口和标准库的稳定性,作为这个过程的一部分,我们将改善swift语言以提供在体验和执行(feel and implementation)的整体的一致性,Swift 3.0将包含2个对2.X

(细节控)swift3.0与融云IMKIT开发问题(一部分) override func onSelectedTableRow Method does not override any method from its superclass

原官网文档方案如下,在swift3.0的情况下出现 override func onSelectedTableRow  Method does not override any method from its superclass 这是因为swift3.0 有很多变更,需要更换下onSelectedTableRow参数. //重写RCConversationListViewController的onSelectedTableRow事件 override func onSelectedTableR

Swift2.3 --> Swift3.0 的变化

Swift3.0语法变化 首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax- 让Xcode帮我们把Swift2.3的代码转换为Swift3.0. 手动调出Xcode自动转换Swift2.3 到 Swift3.0 弹出语言版本选择界面,选择Covert to Swift3,Next:  进入选择模块界面: 选择模块界面 建议只选择自己创建的模块,第三方框架的模块最好不要使用Xco

使用 swift3.0高仿新浪微博

项目地址:https://github.com/SummerHH/swift3.0WeBo 使用 swift3.0 高仿微博,目前以实现的功能有,添加访客视图,用户信息授权,首页数据展示(支持正文中连接匹配,@匹配)支持照片浏览,大图浏览,保存图片到相册本地, 实现发布微博,发微博添加照片,发送Emoticon表情等功能, 先看下项目整体框架 项目使用 MVC 框架,但是在写的过程中也用到了 MVVM设计模式

使用的一些支持swift3.0的开源库

#解决键盘弹起遮挡工具 pod 'IQKeyboardManagerSwift', '~>4.0.6' #多种类型弹出框 pod 'SCLAlertView', :git => 'https://github.com/vikmeup/SCLAlertView-Swift' # Alamofire 网络库 (4.1.0最低支持iOS8.0,4.0最低支持iOS9.0) pod 'Alamofire', '~> 4.0' # swift解析json库 pod 'SwiftyJSON', :g

Swift3.0 函数闭包与OC Block

刚接触Swift,如有不对的点,欢迎指正.转载请说明出处 Swift中定义一个基本函数 //定义一个函数,接收一个字符串,返回一个String类型的值 func test(name:String) -> String { return ("输出了\(name)") } //通用形式 func name(parameters) -> return type { function body } Swift 中基本的闭包函数与OC中Block的相似点 带参闭包 //OC中Bloc

swift3.0:CoreData的使用

一.介绍 CoreData不像slqite3那样编写代码繁琐,同时避免了使用了SQL语句的麻烦,也可以回避使用C语言的语法,降低了iOS开发的技术门槛. CoreData可降低开发成本,提高代码质量.它是一个完全面向对象的API,能够合理管理内存,负责在数据库中存储数据,底层也是由类似 于SQL的技术实现的.CoreData是持久化存储的最佳方式,数据最终的存储类型可以是SQLite数据库.XML.二进制.内存或自定义数据类型 它和SQLite的区别是:只能取出整个实体记录,然后分离,之后才能得

swift3.0 coredata 的使用

//swift3.0在语法上有很大的改变,以简单的增删改查为例,如下: //User类如下: import Foundation import CoreData extension User { @nonobjc public class func fetchRequest() -> NSFetchRequest<User> { return NSFetchRequest<User>(entityName: "User"); } @NSManaged pu

iOS 日期处理 (Swift3.0 NSDate)

处理日期的常见情景 NSDate -> String & String -> NSDate 日期比较 日期计算(基于参考日期 +/- 一定时间) 计算日期间的差异 拆解NSDate对象(分解成year/month/day/hour/minute/second 等) NSDate相关类 NSDate DateFormatter DateComponents DateComponentFormatter Calendar Date structure: Swift3.0中引入了Date s