iOS

[toc]

开发随笔

Swift 变量对外只读,对内可读写

项目中经常需要创建这样一种变量:对内可读写,但对外是只读的。在 OC 中,只需在 .h 文件中将属性定义为 readonly,而在 .m 文件中将该属性重新定义为 readwrite 即可。

可是在 Swift 中却没有这样让我们重新定义权限的机会,那么我们该如何去创建这样的变量呢?

Swift中的实现方式:

1
2
3
class Person {
private(set) var name : String!
}

别看有 private 就以为其他类不能访问 name 属性了,其实只是 setter 方法是私有的,所以在其他类中是可以访问 name 属性的,只是不能修改而已,而在 Person 类中是读写都可以。

怎样优雅的禁用掉Swift中的方法

https://www.jianshu.com/p/ab366b58b7a2?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

尝试理解Swift中的@escaping

https://www.jianshu.com/p/dd0537a40fc6/

ios – Swift – UIButton重写setSelected

http://www.voidcn.com/article/p-cdthfhqm-bte.html

swift函数参数指针传递inout和@escaping冲突的解决方法

https://blog.csdn.net/boildoctor/article/details/111559223

swift3.0 让方法参数可修改方法

https://blog.csdn.net/a1018875550/article/details/75174640

http://cache.baiducontent.com/c?m=m-k2_l-4CMYfEg95YMMh3aMWxKOtc-cVq1Lq_EW6L9ND9ZVpKHWhid_jv2PzArzld_Ken3Rpbsi6Vq0C4j0mlD0T63lrtFzAqErGBjLPrPWxLoJPMvGcDO9IDiaLoRIFgKi0qnIw9jds8KCdPvoVqKaq9zxuJ0mTEj3E8veGxA-srcec28YT0zWiuMzfJgjc&p=cb6ac54ad5c042b90be29628165dcb&newp=8b2a970c82934eac5beee6261547c4231610db2151d7d5106b82c825d7331b001c3bbfb423291403d5c7796d04a44258e8f63271370923a3dda5c91d9fb4c57479c173&s=1679091c5a880faf&user=baidu&fm=sc&query=swift+%D0%DE%B8%C4%B7%BD%B7%A8%D0%CE%B2%CE&qid=ac21cc5c00048b26&p1=9

Swift学习笔记 In-out形参

swift map reduce 获取下标(index)的方法

http://www.voidcn.com/article/p-cstjyafn-bmd.html

Swift 数组删除元素(删除多个)

https://www.meiwen.com.cn/subject/jwpmbctx.html

Swift中编写单例的正确方式

http://www.cocoachina.com/articles/14584

Swift中的nil

Swift中的nil和OC中的nil不一样。OC中的nil表示不存在的对象,你无法给NSInteger类型的变量赋值nil,但是Swift中的nil表示不存在,可以给任何Optional的变量或者常量赋nil,即使是普通类型:

1
2
var a: Int? = nil
let b: Double? = nil

但是,需要注意的是,无法给非Optional类型的变量或者常量赋nil:

swift 数组的添加和删除

insert(_:at:) 在指定位置插入一个元素

insert(contentsOF:at)在指定位置插入多个元素

swift 条件编译 自定义环境变量

https://www.jianshu.com/p/9a93e614a98e

Swift initializer

https://www.jianshu.com/p/bdb07143d368

Swift - 实现动画

https://blog.csdn.net/weixin_43704791/article/details/86529516

iOS

[toc]

UICollectionView SelectItem方法无效的原因

https://blog.csdn.net/weixin_34127717/article/details/88010800

  1. [collectionView reloadData];
  2. [collectionView layoutIfNeeded];
  3. [collectionView selectItemAtIndexPath:indexPath animated:YES scrollPosition:UICollectionViewScrollPositionNone];

UICollectionView删除数据更新

前段时间在做商品收藏的时候,用UICollectionView展示收藏商品,删除收藏用到collection的删除方法。

1
2
3
[self.dataAry removeObjectAtIndex:indexPath.row];

[collectionView deleteItemsAtIndexPaths:@[indexPath]];

发现一个问题,collection执行deleteItems后只会调用numberOfItemsInSection刷新一下item的数量,并不会调用cellForItemAtIndexPath来刷新数据,(因为只是删除,item的内容不会变,只会动一下位置),这就导致了一个问题,当我删除到最后一个cell的时候,发现数组越界。原因是dataAry只剩一个数据,但是indexPath.row=1。

解决方案:

1
2
3
4
5
6
7
[collectionView performBatchUpdates:^{
[self.dataAry removeObjectAtIndex:indexPath.row];
[collectionView deleteItemsAtIndexPaths:@[indexPath]];

} completion:^(BOOL finished) {
[collectionView reloadData];
}];

每次删除执行完后刷新数据。大家有其他解决办法欢迎指正。

所以为了不执行reloadData,

UICollectionView cellForItemAtIndexPath 方法不走

在storyboard 中

UICollectionView cellForItemAtIndexPath not called

被坑了好久,各种问题点查找,终于解决了

解决办法:automaticallyAdjustsScrollViewInsets

1
2
3
4
5
6
7
8
 self.automaticallyAdjustsScrollViewInsets = NO;//解决cellForItemAtIndexPath not called问题

if (@available(iOS 11.0, *)) {
self.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
// Fallback on earlier versions
self.automaticallyAdjustsScrollViewInsets = NO;
}

iOS

[toc]

indexPath 返回nil

请检查是不是在如viewWillAppear的方法中执行了reload

self.contentView.sendSubviewToBack(shadowView) // 请确保 shadowView 和 tableView 加到的是同一个父视图

否则,后添加的视图会盖住前面的视图。如tableView添加到cell上,shadowView添加到cell.contentView上

一、cell的自适应高度

1、基础设置

1
2
3
4
5
tableView.estimatedRowHeight = 60;

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}

2、某行不自适应

1
2
3
4
5
6
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == CQDetailInfoTypeBase) {
return 60;
}
return UITableViewAutomaticDimension;
}

3、如果自适应的cell的高度不够

1
make.height.greaterThanOrEqualTo(@60); // 为了自适应的时候,最小的cell高度不会小于指定值

二、tableView的headerInSectionView 不悬浮

https://blog.csdn.net/wait_foryou/article/details/78256905

1
2
3
4
5
6
7
8
9
10
11
12
13
// UITableView的Style为Plain时, 当tableView上移顶端的tableHeaderView会跟着滑出窗口, 而headerInsectionView则会悬浮固定在窗口顶端不随着滑动继续上移.
// UITableView的Style为Grouped时, 当tableView上移顶端的tableHeaderView会跟着滑出窗口, 而headerInsectionView则会随着滑动继续上移.

// UITableView的Style为Plain时禁止headerInsectionView固定在顶端:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat sectionHeaderHeight = 30;
if(scrollView.contentOffset.y <= sectionHeaderHeight && scrollView.contentOffset.y >= 0) {
scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0,0);
}
else if (scrollView.contentOffset.y >= sectionHeaderHeight) {
scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
}
}

自己的另一种方法

1
2
3
4
5
6
7
8
9
10
11
12
13
// 还是Group

UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return 0;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
UIView *view = [UIView new];
//view.backgroundColor = [UIColor greenColor];
return view;
}

三、tableView等reloadData真正刷新结束后执行下一步操作

reloadData不会等tableView更新结束后才返回,而是立即返回,然后计算表高度,执行滚动之类的代码。
很明显这里的原因是因为数据比较大,一个run loop周期没执行完,tableView滚动时,表的高度不对。

问题场景:

情况1:reloadData后,scrollToRowAtIndexPath未滚动到指定区域

情况2:reloadData后,setContentOffset未滚动到指定区域

解决方法(两种):

1、强制刷新

1
2
3
[self.myTableView reloadData];
[self.myTableView layoutIfNeeded];
[self.myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([self.myTableView numberOfRowsInSection:2]-1) inSection:2] atScrollPosition:UITableViewScrollPositionBottom animated:NO];

layoutIfNeeded会强制重绘并等待完成。

2、线程等待

1
2
3
4
5
[self.myTableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新
[weakSelf.myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([weakSelf.myTableView numberOfRowsInSection:2]-1) inSection:2] atScrollPosition:UITableViewScrollPositionBottom animated:NO];
});

[tableView reloadData]在主队列执行,而dispatch_get_main_queue()会等待主队列空闲后才执行。

OC+Swift混编问题

[TOC]

一、混编配置

1、混编处理

①、OC 调用 Swift

1、建立XXX-Swift.h

附:如果你是OC工程中第一次创建swift文件,则系统会在自动帮你搭建XXX-Bridging-Header.h的同时,为你生成该文件。即那种情况下,此步可略过

2、Defines Module 设置为YES (对Project操作,非Targets)

image-20201106181320734

3、oc 文件中 #import “XXX-Swift.h”

②、Swift 调用 OC

XXX-Bridging-Header.h

二、Property has a previous declaration

将项目中#import “MJExtension.h”的部分,全部替换成

#import <MJExtension/MJExtension.h>

然后问题就解决了。

image-20220808144636522

邓白氏编码申请

[TOC]

一、邓白氏编码的申请

1、Enroll前的了解

1Enroll前的了解

2、点击《Learn More》后会进入如下界面:https://developer.apple.com/support/D-U-N-S/,界面截图如下:

2 D-U-N-S® Number Learn More

3、选择《D-U-N-S Number look up tool》后,会进入 https://developer.apple.com/enroll/cn/duns-lookup/#!/search 查找页面,页面部分截图如下:

3 D-U-N-S® Number 查找页面选择创建

4、选择《请提交您的信息》后会进入 https://developer.apple.com/enroll/cn/duns-lookup/#!/request 页面

二、申请公司身份开发app所需材料

申请公司身份开发app所需材料

查找您的 D-U-N-S 编号:https://developer.apple.com/enroll/cn/duns-lookup/

第1节:ReactNative的Demo实践

[TOC]

ReactNative的Demo实践

一、工程创建

创建APP(iOS & Android)项目

1
react-native init TSDemoDemo

1、iOS工程

1
2
cd iOS项目
pod install

2、Android工程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
终端运行cd myProject切换到项目根目录中,
运行adb devices来确保有设备连接到了电脑上

运行react-native run-android打包编译安卓项目,并部署到模拟器或开发机中

运行上一条命令之前,要确保有设备连接到了电脑上,可以运行adb devices查看当前接入的设备列表;如果无法检查到设备列表,请先确保手机开启了开发者模式,同时要电脑上要安装手机的驱动程序;

注意:首次打包时候,会联网下载gradle相关的文件,需要等待很长时间,大家可以直接从http://www.androiddevtools.cn/手动下载对应版本的gradle文件,并手动拷贝解压到C:\Users\自己的用户名\.gradle\wrapper\dists目录下;

注意:接下来,如果是第一次打包,会从https://jcenter.bintray.com下载好多的依赖项,此时需要耐心等待,如果中间出现了长时间卡顿,大家需要Ctrl+C停止打包,并重新运行react-native run-android

作者:白小白大白白
链接:https://www.jianshu.com/p/ab8bf4128b0e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二、添加路由

参考文档

1
2
3
4
5
6
7
8
9
10
11

yarn add @react-navigation/native


yarn add react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view

③在iOS工程中,重新 pod install


④接下来,因为从React Navigation4.x版本开始,堆栈导航库就已经被分离出来,作为单独的依赖文件,所以要想添加StackNavigator的依赖
yarn add @react-navigation/stack

三、

参考文章:

四、发布

1
2
3
4
5
npm config get registry

npm login

npm publish --access=public

详情查看:代码管理/库管理/npmjs/npmjs的发布