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) } } }


效果图:



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






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4727952.html,如需转载请自行联系原作者


相关文章
|
7月前
|
Swift iOS开发
Swift 语言: 什么是协议(Protocol)?如何实现和使用协议?
Swift 语言: 什么是协议(Protocol)?如何实现和使用协议?
204 2
|
4月前
|
测试技术 Swift iOS开发
探索iOS自动化测试:使用Swift编写UI测试
【8月更文挑战第31天】在软件开发的海洋中,自动化测试是保证船只不偏离航线的灯塔。本文将带领读者启航,深入探索iOS应用的自动化UI测试。我们将通过Swift语言,点亮代码的灯塔,照亮测试的道路。文章不仅会展示如何搭建测试环境,还会提供实用的代码示例,让理论知识在实践中生根发芽。无论你是新手还是有经验的开发者,这篇文章都将是你技能提升之旅的宝贵指南。
|
7月前
|
人工智能 物联网 API
LLM 大模型学习必知必会系列(十三):基于SWIFT的VLLM推理加速与部署实战
LLM 大模型学习必知必会系列(十三):基于SWIFT的VLLM推理加速与部署实战
LLM 大模型学习必知必会系列(十三):基于SWIFT的VLLM推理加速与部署实战
|
5月前
|
JavaScript
vue项目中升级element ui(含常见报错及解决方案,如表格不显示,el-table无效, “__v_isRef“ is not defined,Use :deep() instead)
vue项目中升级element ui(含常见报错及解决方案,如表格不显示,el-table无效, “__v_isRef“ is not defined,Use :deep() instead)
71 0
|
7月前
|
JSON 监控 数据格式
Easy UI datagrid的学习
Easy UI datagrid的学习
|
JavaScript
【Vue学习】—Vue UI组件库(二十八)
【Vue学习】—Vue UI组件库(二十八)
|
XML 数据安全/隐私保护 数据格式
Morn UI 学习总结
Morn UI 学习总结
74 0
|
存储 数据管理 数据库
CoreData 在 swift UI 中的使用
当谈到在 Swift UI 中进行本地数据持久化,Core Data 是一个强大且常用的解决方案。Core Data 是苹果提供的一种数据存储和管理框架,用于在应用程序中创建、读取、更新和删除数据。它提供了一个对象图管理器,可以将数据映射到对象,并提供了一种简化数据操作的方式。在本文中,我们将深入介绍 Core Data 在 Swift UI 中的使用。
CoreData 在 swift UI 中的使用
|
前端开发 JavaScript
【编写前端需要学习的知识】Vue2+Element-UI
【编写前端需要学习的知识】Vue2+Element-UI
77 0
|
开发框架 JavaScript 前端开发
HarmonyOS学习路之开发篇—Java UI框架(使用工具自动生成JS FA调用PA代码)
JS FA(Feature Ability)调用PA (Particle Ability)是使用基于JS扩展的类Web开发范式的方舟开发框架所提供的一种跨语言能力调用的机制,用于建立JS能力与Java能力之间传递方法调用、处理数据返回以及订阅事件上报的通道。开发者可以使用FA调用PA机制进行应用开发,但直接使用该机制需要开发者手动撰写大量模板代码,且模板代码可能与业务代码相互耦合,使得代码可维护性和可读性较差。