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: "[email protected]")
            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)
        }
    }
}

效果图:

Swift UI学习之UITableView and protocol use_第1张图片Swift UI学习之UITableView and protocol use_第2张图片


你可能感兴趣的:(Swift开发语言学习)