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
}
}
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()
}
}
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: "[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
}
}
}
}
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)
}
}
}