实战编程·使用SwiftUI从0到1完成一款iOS笔记App(五)(2)

简介: 实战编程·使用SwiftUI从0到1完成一款iOS笔记App(五)

顶部搜索栏

再往上是顶部搜索栏,如下代码所示:

// MARK: 搜索栏
    func searchBarView() -> some View {
        TextField("搜索内容", text: $viewModel.searchText)
            .padding(7)
            .padding(.horizontal, 25)
            .background(Color(.systemGray6))
            .cornerRadius(8)
            .overlay(
                HStack {
                    Image(systemName: "magnifyingglass")
                        .foregroundColor(.gray)
                        .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
                        .padding(.leading, 8)
                    // 编辑时显示清除按钮
                    if viewModel.searchText != "" {
                        Button(action: {
                            self.viewModel.searchText = ""
                            self.viewModel.loadItems()
                        }) {
                            Image(systemName: "multiply.circle.fill")
                                .foregroundColor(.gray)
                                .padding(.trailing, 8)
                        }
                    }
                }
            )
            .padding(.horizontal, 10)
            .onChange(of: viewModel.searchText) { _ in
                if viewModel.searchText != "" {
                    self.viewModel.isSearching = true
                    self.viewModel.searchContet()
                } else {
                    viewModel.searchText = ""
                    self.viewModel.isSearching = false
                    self.viewModel.loadItems()
                }
            }
    }

image.png

搜索栏改动的内容有三部分,首先是绑定的输入内容换成了viewModel中的searchText

然后是当搜索栏输入时,显示删除的按钮操作,关联的参数也换成viewModel中的searchText,当点击清除搜索内容时,需要将搜索栏输入的内容清空,然后再调用loadItems重新加载列表中的数据。

最后是搜索栏的搜索方法,当输入时,读取searchText输入的内容,如果输入内容不为空,则更新isSearching是否正在搜索的状态为true,然后调用searchContet搜索方法。如果输入的内容为空,那么更新isSearching是否正在搜索的状态为false,并调用loadItems重新加载列表数据。

新建笔记按钮

新建笔记按钮的操作是打开新建笔记弹窗,修改内容如下代码所示:

// MARK: 新建笔记按钮
    func newBtnView() -> some View {
        VStack {
            Spacer()
            HStack {
                Spacer()
                Button(action: {
                    self.viewModel.isAdd = true
                    self.viewModel.writeTime = viewModel.getCurrentTime()
                    self.viewModel.title = ""
                    self.viewModel.content = ""
                    self.viewModel.showNewNoteView = true
                }) {
                    Image(systemName: "plus.circle.fill")
                        .font(.system(size: 48))
                        .foregroundColor(.blue)
                }
            }
        }
        .padding(.bottom, 32)
        .padding(.trailing, 32)
    }

image.png

新建笔记按钮修改点就只有点击时的交互动作,当点击新建笔记按钮时,需要更新viewModel中的是否新增状态isAddtrue,表明点击这个按钮是新增,而我们在单条笔记列表设置isAdd为false,表示当前是在编辑笔记。

当新增笔记的时候,调用getCurrentTime设置新建笔记的时间为当前时间,设置title标题、content内容为空,并且更新showNewNoteViewtrue,作为打开新建笔记弹窗的触发参数。

主视图

缺省图视图基本就不用改了,最后回到body部分,修改如下代码所示:

var body: some View {
        NavigationView {
            ZStack {
                if viewModel.isSearching == false && viewModel.noteModels.count == 0 {
                    noDataView()
                } else {
                    VStack {
                        searchBarView()
                        noteListView()
                    }
                }
                newBtnView()
            }
            .navigationBarTitle("念头笔记", displayMode: .inline)
        }
        .sheet(isPresented: $viewModel.showNewNoteView) {
            //打开新建笔记弹窗
        }
    }

image.png

上述代码中,我们通过判断isSearching当前是否处于搜索状态,以及noteModels数组是是否有数据,来判断当前应该展示缺省视图noDataView,还是展示searchBarView搜索栏和noteListView笔记列表。

已经在首页增加sheet绑定showNewNoteView触发打开新建笔记弹窗。

最后,我们还需要在视图预览的时候引用viewModel,如下代码所示:

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environmentObject(ViewModel())
    }
}

好了,首页基本修改完毕了,是不是有点疲劳?回看下整个ContentView的代码,是不是简洁了很多,基本没有声明什么参数,因为需要用到的参数都放在了ViewModel里,而且用到的实现功能的方法也都放在ViewModel。

Model用来定义数据模型,View视图用来实现基础交互和页面样式,然后ViewModel用来做数据处理和功能实现,这就是MVVM开发模式

休息好了,我们就继续吧~


相关文章
|
2月前
沐编程APP免费下载
沐编程APP免费下载
40 9
沐编程APP免费下载
|
3月前
|
存储 Web App开发 iOS开发
Electron 从基础到实战笔记 - Electron App对象及其事件
Electron 从基础到实战笔记 - Electron App对象及其事件
123 0
|
5月前
|
iOS开发
实战编程·使用SwiftUI从0到1完成一款iOS笔记App(五)(3)
实战编程·使用SwiftUI从0到1完成一款iOS笔记App(五)
60 0
|
1月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
88 3
|
3月前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
122 2
|
3月前
|
存储 数据建模 数据库
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
39 0
|
3月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
93 2
|
3月前
|
API 开发工具 iOS开发
iOS 开发高效率工具包:10 大必备工具
iOS 开发高效率工具包:10 大必备工具
48 1
|
3月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
54 1
|
9天前
|
API 定位技术 iOS开发
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
【4月更文挑战第18天】**Cocoa Touch** 是iOS和Mac OS X应用的核心框架,包含面向对象库、运行时系统和触摸优化工具。它提供Mac验证的开发模式,强调触控接口和性能,涵盖3D图形、音频、网络及设备访问API,如相机和GPS。是构建高效iOS应用的基础,对开发者至关重要。
12 0