zoukankan      html  css  js  c++  java
  • Swift UI学习UITableView and protocol use

    Models: UserModel.swift

    Views: UserInfoCell.swift

    Controllers: RootViewController.swift, DetailViewController.swift


    AppDelegate.swift:

    import UIKit
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
        var window: UIWindow?
    
        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?

    ) -> Bool { self.window = UIWindow(frame: UIScreen.mainScreen().bounds) // let rootController = RootViewController(style: UITableViewStyle.Plain) let rootNav = UINavigationController(rootViewController: rootController) self.window!.rootViewController = rootNav // self.window!.backgroundColor = UIColor.whiteColor() self.window!.makeKeyAndVisible() return true } }


    UserModel.swift

    import Foundation
    
    //
    // @brief The model of user, using to store user datas
    // @author huangyibiao
    //
    class UserModel : NSObject {
        var userName: String     ///< store user's name, optional
        var userID: Int          ///< store user's ID
        var phone: String?       ///< store user's telephone number
        var email: String?       ///< store user's email
        
        // designated initializer
        init(userName: String, userID: Int, phone: String?, email: String?) {
            self.userName = userName
            self.userID = userID
            self.phone = phone
            self.email = email
            
            super.init()
        }
    }
    

    UserInfoCell.swift:

    import Foundation
    import UIKit
    
    //
    // @brief The cell of showing user infos
    // @author huangyibiao
    //
    class UserInfoCell : UITableViewCell {
        var userNameLabel : UILabel!
        var phoneLabel : UILabel!
        var emailLabel : UILabel!
        
        init(style: UITableViewCellStyle, reuseIdentifier: String!) {
            super.init(style: style, reuseIdentifier: reuseIdentifier)
    
            userNameLabel = UILabel(frame: CGRectMake(30, 0, 100, 44))
            userNameLabel.backgroundColor = UIColor.clearColor()
            userNameLabel.font = UIFont.systemFontOfSize(14)
            self.contentView.addSubview(userNameLabel)
            
            phoneLabel = UILabel(frame: CGRectMake(120, 0, 200, 20))
            phoneLabel.backgroundColor = UIColor.clearColor()
            phoneLabel.font = UIFont.systemFontOfSize(12)
            self.contentView.addSubview(phoneLabel)
    
            emailLabel = UILabel(frame: CGRectMake(120, 20, 200, 20))
            emailLabel.backgroundColor = UIColor.clearColor()
            emailLabel.font = UIFont.systemFontOfSize(12)
            self.contentView.addSubview(emailLabel)
        }
    
        func configureCell(userModel: UserModel?) {
            if let model = userModel {
                userNameLabel.text = model.userName
                phoneLabel.text = model.phone
                emailLabel.text = model.email
            }
        }
    }


    RootViewController.swift:

    import Foundation
    import UIKit
    
    //
    // @brief 作为窗体的rootViewControllor
    // @author huangyibiao
    //
    
    class RootViewController : UITableViewController, DetailViewControllerDelegate {
        var dataSource = NSMutableArray()
        var currentIndexPath: NSIndexPath?
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            for index in 0...12 {
                let model = UserModel(userName: "name:(index + 1)",
                    userID: index, phone: "13877747982", email: "632840804@qq.com")
                dataSource.addObject(model)
            }
            
            self.title = "UITableViewDemo"
        }
        
        override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int  {
            return dataSource.count
        }
        
        override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
            // can't use static?

    let cellIdentifier: String = "UserInfoCellIdentifier" // may be no value, so use optional var cell: UserInfoCell?

    = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? UserInfoCell if cell == nil { // no value cell = UserInfoCell(style: UITableViewCellStyle.Default, reuseIdentifier: cellIdentifier) } let model: UserModel?

    = dataSource[indexPath.row] as? UserModel cell!.configureCell(model) return cell } override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { let detail = DetailViewController() detail.userModel = dataSource[indexPath.row] as?

    UserModel detail.delegate = self currentIndexPath = indexPath self.navigationController.pushViewController(detail, animated: true) } func changeItem(forUserModel userModel: UserModel?) { var index = 0 for index = 0; index < dataSource.count; index++ { let model = dataSource[index] as UserModel if model.userID == userModel?.userID { model.phone = userModel?

    .phone model.email = userModel?.email tableView.reloadRowsAtIndexPaths([currentIndexPath!], withRowAnimation: UITableViewRowAnimation.Fade) break } } } }



    DetailViewController.swift:

    import Foundation
    import UIKit
    
    // this delegate needs a @objc, because @optional is only for objective-c, not for swift
    @objc protocol DetailViewControllerDelegate : NSObjectProtocol {
        @optional func changeItem(forUserModel userModel: UserModel?)
    }
    
    class DetailViewController : UIViewController {
        var userModel: UserModel?
        var delegate: DetailViewControllerDelegate?
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            self.view.backgroundColor = UIColor.whiteColor()
            self.title = userModel?

    .userName let button = UIButton(frame: CGRectMake(10, 200, 300, 40)) button.setTitle("change", forState:UIControlState.Normal) button.backgroundColor = UIColor.redColor() button.addTarget(self, action: "onChangeButtonClick:", forControlEvents: UIControlEvents.TouchUpInside) self.view.addSubview(button) } func onChangeButtonClick(sender: UIButton!) { if userModel { userModel!.userName = "ChangeName" // changeItem needs to add a ? to the end, before (), because // this function is optional // delegate?

    表示可能没有代理。而changeItem?

    表示方法可能没有实现,这样写就算没有实现也没有问题 delegate?.changeItem?

    (forUserModel: userModel) self.navigationController.popViewControllerAnimated(true) } } }


    效果图:



    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    Python Try Except
    Python 爬虫常用模块
    numpy中的数学
    机器学习名词
    numpy 矩阵变换transpose和swapaxes
    【Spark-core学习之四】 Spark任务提交
    【Spark-core学习之三】 Spark集群搭建 & spark-shell & Master HA
    【Spark-core学习之二】 RDD和算子
    【Spark-core学习之一】 Spark初识
    【Scala学习之二】 Scala 集合 Trait Actor
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4727952.html
Copyright © 2011-2022 走看看