日期: 2021 年 8 月 10 日

mac:通过鼠标右键 新建文本文档

%title插图%num
经常会想要在指定目录下新建一个文本文档,在Windows上鼠标右键就可以创建,想在mac上也实现类似的效果,于是动了动手。

主要功能:在Finder(访达)中,选中一个文件或文件夹,鼠标右键稍微点一下就能够在同目录下创建文本文档。

启动 自动操作
输入关键词 自动操作 或 automator 启动

%title插图%num
新建 一个workflow
选择 “快速操作”

%title插图%num

工作流程收到当前 选择 文件或文件夹,这样当我们选中文件或文件夹时右键菜单就有当前的workflow了

左侧输入框输入 关键词“shell”,双击“运行Shell脚本”

%title插图%num

Shell 选择 “/bin/bash”

传递输入 选择 “作为自变量”

%title插图%num
粘贴代码

%title插图%num
# 选中文件时,获取其目录名
if [ -f “$1″ ];then
myFile=”$1″
myDir=${myFile%/*}
else
myDir=”$1”
fi

# 如果txt不存在,则创建
myFile=$myDir/readme.txt
if [ ! -f “$myFile” ];then
printf “”>”$myFile”
fi

# 在Finder中选中txt
open -R “$myFile”

保存 ,名字建议加上emoji表情,比如“✏️新建文本文档”,以便要用时能很快地找到
使用,保存完后,在Finder中选中文件/文件夹,执行 鼠标右键 → 服务 → “✏️新建文本文档”,此时在Finder中就会多出一个 readme.txt 的文件,并且会自动选中它。

%title插图%num

%title插图%num
Q: 选中多个文件/文件夹能执行这个命令么?
A: 都可以。选中多个文件夹时,只有*个文件夹下面会有txt。

Q:选中的多个对象中,既有文件又有文件夹呢
A:选中的*个(文件 和 文件夹)下面会有txt。

 

(0108)iOS开发之Xcode11: 删除默认Main.storyBoard、自定义根控制器

Xcode11 新建OC 工程后,发生了很大的变化,发现多了两个文件夹。

%title插图%num

原因: Xcode自动新增了一个SceneDelegate文件, 也就是说在iOS13中Appdelegate的作用发生了改变: iOS13之前,Appdelegate的作用是全权处理App生命周期和UI生命周期; iOS13之后,Appdelegate的作用是只处理 App 生命周期, 而UI的生命周期将全权由新增的SceneDelegate来处理.

那怎么回到原来熟悉的方式尼:删除默认Main.storyBoard、自定义根控制器?

方法一:(推荐)在新增的 SceneDelegate文件中添加。先把下面框住的配置删除。

%title插图%num
初始化window方法不再在Appdelegate的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions进行初始化, 而是在SceneDelegate中初始化了,如下:

– (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).

// 自定义根控制器
self.window = [[UIWindow alloc] initWithWindowScene:(UIWindowScene *)scene];
UIViewController *rootVc = [[UIViewController alloc]init];
rootVc.view.backgroundColor = [UIColor purpleColor];
rootVc.title = @”scene”;
UINavigationController *rootNav = [[UINavigationController alloc]initWithRootViewController:rootVc];
[self.window setRootViewController:rootNav];
[self.window makeKeyAndVisible];

}

 

同样实现的我们自定义跟控制器。

方法二:将SceneDelegate 相关的全部删除。把系统自动生成的ViewController也一同删除。在AppDelegate.h 中加上
@interface AppDelegate : UIResponder <UIApplicationDelegate>

// 重新添加回来
@property (strong, nonatomic) UIWindow * window;

@end

 

didFinishLaunchingWithOptions 中方法中写我们熟悉的代码了。

– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

// 1.创建UIWindow
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// 设置UIWindow的背景颜色
self.window.backgroundColor = [UIColor whiteColor];

HomeViewController *homeVC = [HomeViewController new];
UINavigationController *homeNav = [[UINavigationController alloc] initWithRootViewController:homeVC];;

self.window.rootViewController = homeNav;

[self.window makeKeyAndVisible];

return YES;

}

记得把AppDelegate.m 下面 UISceneSession lifecycle的代码删除了, 就OK 了。可以把原来熟悉的生命周期的代理方法加回来。

(006)RN开发之iOS真机调试

*步,使用Xcode打开项目
第二步,使用真机运行项目
第三步,晃动手机,选择Debug JS Remotely
浏览器会自动打开地址:http://localhost:8081/debugger-ui/
第四步,将localhost修改为本机ip地址
查看电脑ip地址的方法:点击WiFi图标 –> 打开网络偏好设置…

将第三步中的地址改为:http://192.168.37.66:8081/debugger-ui/ (说明:192.168.37.66是我电脑的ip地址,这里需要替换为你自己的电脑的ip地址)

第五步,使用Xcode重新运行项目

Mac-使用文本编辑的html浏览器打开出现源代码问题

在用Mac 的文本编辑编写了一段简单的代码,然后修改后缀.html。用Safari 打开时却显示源码?

问题解决:

*步:编辑HTML 代码是要以纯文本编辑。

%title插图%num

第二步:文本编辑 > 偏好设置——在“打开和存储”栏目中,勾上“将HTML文件显示为HTML代码而不显示为格式化的文本”,勾掉“给纯文本文件添加.txt扩展名”。

%title插图%num

第三步:从菜鸟教程 copy 一段html 代码。贴到文本中,存储文件。

<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>菜鸟教程(runoob.com)</title>
</head>
<body>

<h1>我的*个标题</h1>

<p>我的*个段落。</p>

</body>
</html>

 

第四步:右击文本文件修改后缀名为.html。

第五步:将浏览器(这里以Safari为例)中选择偏好设置->高级->默认编码,在下拉菜单里选择UTF-8。

%title插图%num

第六步:保存设置,双击打开文件即可。效果如下:成功打开了。

%title插图%num

 

(0106)iOS开发之iOS13 适配

UIWebview 将被废止

%title插图%num
UITextField 的私有属性 _placeholderLabel
[self.textField setValue:self.placeholderColor forKeyPath:@”_placeholderLabel.textColor”];

居然崩溃了,错误信息如下

‘Access to UITextField’s _placeholderLabel ivar is prohibited. This is an application bug’

解决方法

方案A:

UITextField有个attributedPlaceholder的属性,我们可以自定义这个富文本来达到我们需要的结果。

NSMutableAttributedString *placeholderString = [[NSMutableAttributedString alloc] initWithString:placeholder attributes:@{NSForegroundColorAttributeName : self.placeholderColor}];
_textField.attributedPlaceholder = placeholderString;

方案B:

#import <objc/runtime.h>

Ivar ivar = class_getInstanceVariable([UITextField class], “_placeholderLabel”);
UILabel *placeholderLabel = object_getIvar(textField, ivar);
placeholderLabel.textColor = [UIColor whiteColor];

iOS 13 通过 KVC 方式修改私有属性,有 Crash 风险,谨慎使用!并不是所有KVC都会Crash,要尝试!

MPMoviePlayerController 在iOS 13已经不能用了
‘MPMoviePlayerController is no longer available. Use AVPlayerViewController in AVKit.’
1
解决方案:

既然不能再用了,那只能换掉了。替代方案就是AVKit里面的那套播放器。

iOS 13 DeviceToken有变化
NSString *dt = [deviceToken description];
dt = [dt stringByReplacingOccurrencesOfString: @”<” withString: @””];
dt = [dt stringByReplacingOccurrencesOfString: @”>” withString: @””];
dt = [dt stringByReplacingOccurrencesOfString: @” ” withString: @””];
这段代码运行在 iOS 13 上已经无法获取到准确的DeviceToken字符串了,iOS 13 通过[deviceToken description]获取到的内容已经变了。

解决方案

方案A:
– (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
if (![deviceToken isKindOfClass:[NSData class]]) return;
const unsigned *tokenBytes = [deviceToken bytes];
NSString *hexToken = [NSString stringWithFormat:@”%08x%08x%08x%08x%08x%08x%08x%08x”,
ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
NSLog(@”deviceToken:%@”,hexToken);
}

方案B:

NSMutableString *deviceTokenString = [NSMutableString string];
const char *bytes = deviceToken.bytes;
NSInteger count = deviceToken.length;
for (int i = 0; i < count; i++) {
[deviceTokenString appendFormat:@”%02x”, bytes[i]&0x000000FF];
}

UITableViewCell的UITableViewCellAccessoryDisclosureIndicator显示不正常
解决方案:
cell.accessoryView = [[UIImageView alloc] initWithImage:…];
使用图片来显示。

Sign in with Apple -提供第三方登录的注意啦
如果你的应用使用了第三方登录,那么你可能也需要加下 「Sign in with Apple」
Sign In with Apple will be available for beta testing this summer. It will be required as an option for users in apps that support third-party sign-in when it is commercially available later this year.

解决方案
附上官方Demo:点我下载

控制器的 modalPresentationStyle 默认值变了
查阅了下 UIModalPresentationStyle枚举定义,赫然发现iOS 13新加了一个枚举值:
typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {
UIModalPresentationFullScreen = 0,
UIModalPresentationPageSheet API_AVAILABLE(ios(3.2)) API_UNAVAILABLE(tvos),
UIModalPresentationFormSheet API_AVAILABLE(ios(3.2)) API_UNAVAILABLE(tvos),
UIModalPresentationCurrentContext API_AVAILABLE(ios(3.2)),
UIModalPresentationCustom API_AVAILABLE(ios(7.0)),
UIModalPresentationOverFullScreen API_AVAILABLE(ios(8.0)),
UIModalPresentationOverCurrentContext API_AVAILABLE(ios(8.0)),
UIModalPresentationPopover API_AVAILABLE(ios(8.0)) API_UNAVAILABLE(tvos),
UIModalPresentationBlurOverFullScreen API_AVAILABLE(tvos(11.0)) API_UNAVAILABLE(ios) API_UNAVAILABLE(watchos),
UIModalPresentationNone API_AVAILABLE(ios(7.0)) = -1,
UIModalPresentationAutomatic API_AVAILABLE(ios(13.0)) = -2,
};

解决方法

方案A:
如果你完全接受苹果的这个默认效果,那就不需要去修改任何代码。
如果,你原来就比较细心,已经设置了modalPresentationStyle的值,那你也不会有这个影响。
对于想要找回原来默认交互的同学,直接设置如下即可:

self.modalPresentationStyle = UIModalPresentationOverFullScreen;

方案B:
如果要一次全局更改的话,设置UIViewController Catagory即可以解决:

@implementation UIViewController(modalPresentationStyle)

– (UIModalPresentationStyle)modalPresentationStyle{
if (@available(iOS 13.0, *)) {
if ([self isKindOfClass:[UIActivityViewController class]]) {
return UIModalPresentationPageSheet;
}else{
return UIModalPresentationFullScreen;
}
}
return UIModalPresentationPopover;
}

即将废弃的 LaunchImage
从 iOS 8 的时候,苹果就引入了 LaunchScreen,我们可以设置 LaunchScreen来作为启动页。当然,现在你还可以使用LaunchImage来设置启动图。不过使用LaunchImage的话,要求我们必须提供各种屏幕尺寸的启动图,来适配各种设备,随着苹果设备尺寸越来越多,这种方式显然不够 Flexible。而使用 LaunchScreen的话,情况会变的很简单, LaunchScreen是支持AutoLayout+SizeClass的,所以适配各种屏幕都不在话下。
1
注意啦⚠️,从2020年4月开始,所有使⽤ iOS13 SDK的 App将必须提供 LaunchScreen,LaunchImage即将退出历史舞台*。

UISearchBar显示问题
SearchBar的高度只有1px

升级到iOS13,UISearchController上的SearchBar显示异常,查看后发现对应的高度只有1px,目前没找到具体导致的原因,
解决办法是: 使用KVO监听frame值变化后设置去应该显示的高度
黑线处理crash

之前为了处理搜索框的黑线问题会遍历后删除UISearchBarBackground,在iOS13会导致UI渲染失败crash;
解决办法是: 设置UISearchBarBackground的layer.contents为nil
TabBar红点偏移

如果之前有通过TabBar上图片位置来设置红点位置,在iOS13上会发现显示位置都在*左边去了。遍历UITabBarButton的subViews发现只有在TabBar选中状态下才能取到UITabBarSwappableImageView,
解决办法是: 修改为通过UITabBarButton的位置来设置红点的frame

养兔子

养兔子
题目 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1
程序分析 我认为原文的解法有点扯,没有考虑3个月成熟的问题,人家还是婴儿怎么生孩子?考虑到三个月成熟,可以构建四个数据,其中:一月兔每个月长大成为二月兔,二月兔变三月兔,三月兔变成年兔,成年兔(包括新成熟的三月兔)生等量的一月兔。
1
month=int(input(‘繁殖几个月?:’))
month_1=1
month_2=0
month_3=0
month_elder=0
for i in range(month):
    month_1,month_2,month_3,month_elder=month_elder+month_3,month_1,month_2,month_elder+month_3
    print(‘第%d个月共’%(i+1),month_1+month_2+month_3+month_elder,’对兔子’)
    print(‘其中1月兔:’,month_1)
    print(‘其中2月兔:’,month_2)
    print(‘其中3月兔:’,month_3)
    print(‘其中成年兔:’,month_elder)

所有水仙花数

所有水仙花数
题目 打印出所有的”水仙花数”,所谓”水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个”水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
程序分析 利用for循环控制100-999个数,每个数分解出个位,十位,百位。
1
for i in range(100,1000):
    s=str(i)
    one=int(s[-1])
    ten=int(s[-2])
    hun=int(s[-3])
    if i == one**3+ten**3+hun**3:

分解质因数

分解质因数
题目 将一个整数分解质因数。例如:输入90,打印出90=233*5。
1
程序分析 根本不需要判断是否是质数,从2开始向数本身遍历,能整除的肯定是*小的质数。
1
target=int(input(‘输入一个整数:’))
print(target,’= ‘,end=”)
if target<0:
    target=abs(target)
    print(‘-1*’,end=”)
flag=0
if target<=1:
    print(target)
    flag=1
while True:
    if flag:
        break
    for i in range(2,int(target+1)):
        if target%i==0:
            print(“%d”%i,end=”)
            if target==i:
                flag=1
                break
            print(‘*’,end=”)

分数归档

分数归档
题目 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
1
程序分析 用条件判断即可。
1
points=int(input(‘输入分数:’))
if points>=90:
    grade=’A’
elif points<60:
    grade=’C’
else:
    grade=’B’
print(grade)

输出日期

输出日期
题目 输出指定格式的日期。
1
程序分析 使用 datetime 模块。
1
import datetime
print(datetime.date.today())
print(datetime.date(2333,2,3))
print(datetime.date.today().strftime(‘%d/%m/%Y’))
day=datetime.date(1111,2,3)
day=day.replace(year=day.year+22)
print(day)
友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速