http://blog.csdn.net/woaifen3344/article/details/29883183
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
- }
- }
- }
- 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)
- }
- }
- }
效果图: