Use UIPickerView as UITextField text input

This commit is contained in:
Duy Tran Khanh authored and GitHub committed 2021-06-16 06:08:31 +07:00
1 parent f43974e318
commit b372cfd434
1 file changed
+117 -17
+117 -17
View File
@@ -3,7 +3,7 @@
#include "utils.h"
@interface LauncherViewController () {
@interface LauncherViewController () <UIPickerViewDataSource, UIPickerViewDelegate> {
}
// - (void)method
@@ -12,6 +12,8 @@
@implementation LauncherViewController
NSMutableArray* versionList;
UIPickerView* versionPickerView;
UITextField* versionTextField;
- (void)viewDidLoad
@@ -47,19 +49,33 @@ UITextField* versionTextField;
NSLog(@"Error: could not read config_ver.txt");
}
UILabel *versionTextView = [[UILabel alloc] initWithFrame:CGRectMake(4.0, 4.0, 0.0, 30.0)];
UILabel *versionTextView = [[UILabel alloc] initWithFrame:CGRectMake(4.0, 4.0, 0.0, 0.0)];
versionTextView.text = @"Minecraft version: ";
versionTextView.numberOfLines = 0;
[versionTextView sizeToFit];
[scrollView addSubview:versionTextView];
[self fetchVersionList];
versionPickerView = [[UIPickerView alloc] init];
versionPickerView.delegate = self;
versionPickerView.dataSource = self;
UIToolbar *versionPickToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, 44.0)];
UIBarButtonItem *versionFlexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
UIBarButtonItem *versionDoneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(versionClosePicker)];
versionPickToolbar.items = @[versionFlexibleSpace, versionDoneButton];
versionTextField = [[UITextField alloc] initWithFrame:CGRectMake(versionTextView.bounds.size.width + 4.0, 4.0, width - versionTextView.bounds.size.width - 8.0, versionTextView.bounds.size.height)];
[versionTextField addTarget:versionTextField action:@selector(resignFirstResponder) forControlEvents:UIControlEventEditingDidEndOnExit];
versionTextField.placeholder = @"Specify version...";
versionTextField.text = [NSString stringWithUTF8String:configver];
versionTextField.inputAccessoryView = versionPickToolbar;
versionTextField.inputView = versionPickerView;
fclose(configver_file);
[scrollView addSubview:versionTextField];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Settings" style:UIBarButtonItemStyleDone target:self action:@selector(enterPreferences)];
install_progress_bar = [[UIProgressView alloc] initWithFrame:CGRectMake(4.0, height - 58.0, width - 8.0, 6.0)];
@@ -75,6 +91,104 @@ UITextField* versionTextField;
[scrollView addSubview:install_progress_text];
}
- (void)fetchVersionList
{
NSURLSession *session = [NSURLSession sharedSession];
NSMutableURLRequest *request =
[[NSMutableURLRequest alloc] initWithURL:[NSURL
URLWithString:@"https://launchermeta.mojang.com/mc/game/version_manifest.json"]];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
long statusCode = (long)[httpResponse statusCode];
NSString *dataStr = [NSString stringWithUTF8String:[data bytes]];
NSError *jsonError = nil;
NSDictionary *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
if (jsonError != nil) {
NSLog(@"Warning: Error parsing version list JSON: %@", jsonError);
} else if (statusCode == 200) {
NSArray *remoteVersionList = [jsonArray valueForKey:@"versions"];
assert(remoteVersionList != nil);
dispatch_async(dispatch_get_main_queue(), ^{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *versionPath = @"/var/mobile/Documents/minecraft/versions/";
NSArray *localVersionList = [fileManager contentsOfDirectoryAtPath:versionPath error:Nil];
versionList = [[NSMutableArray alloc] init];
int i = 0;
for (NSDictionary *versionInfo in remoteVersionList) {
NSString *versionId = [versionInfo valueForKey:@"id"];
[versionList addObject:versionId];
if ([versionTextField.text isEqualToString:versionId]) {
[versionPickerView selectRow:i inComponent:0 animated:NO];
}
i++;
}
for (NSString *versionId in localVersionList) {
NSString *localPath = [versionPath stringByAppendingString:versionId];
BOOL isDir;
[fileManager fileExistsAtPath:localPath isDirectory:&isDir];
if (isDir && ! [versionList containsObject:versionId]) {
[versionList addObject:versionId];
if ([versionTextField.text isEqualToString:versionId]) {
[versionPickerView selectRow:i inComponent:0 animated:NO];
}
}
i++;
}
[versionPickerView reloadAllComponents];
});
} else {
NSString *err_title = [jsonArray valueForKey:@"error"];
NSString *err_msg = [jsonArray valueForKey:@"errorMessage"];
NSLog(@"Warning: failed to fetch version list: %@: %@", err_title, err_msg);
}
}];
[postDataTask resume];
}
#pragma mark - Button click events
- (void)enterPreferences {
LauncherPreferencesViewController *vc = [[LauncherPreferencesViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
}
- (void)launchMinecraft:(id)sender {
[(UIButton*) sender setEnabled:NO];
callback_LauncherViewController_installMinecraft();
}
#pragma mark - UIPickerView stuff
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
versionTextField.text = [versionList objectAtIndex:row];
[versionTextField.text writeToFile:@"/var/mobile/Documents/minecraft/config_ver.txt" atomically:NO encoding:NSUTF8StringEncoding error:nil];
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView {
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
return versionList.count;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [versionList objectAtIndex:row];
}
- (void)versionClosePicker {
[versionTextField endEditing:YES];
}
#pragma mark - View controller UI mode
- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures {
return UIRectEdgeBottom;
}
@@ -83,7 +197,7 @@ UITextField* versionTextField;
return NO;
}
-(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
if(@available(iOS 13.0, *)) {
if (UITraitCollection.currentTraitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
self.view.backgroundColor = [UIColor blackColor];
@@ -93,18 +207,4 @@ UITextField* versionTextField;
}
}
- (void)launchMinecraft:(id)sender
{
[(UIButton*) sender setEnabled:NO];
[versionTextField.text writeToFile:@"/var/mobile/Documents/minecraft/config_ver.txt" atomically:NO encoding:NSUTF8StringEncoding error:nil];
callback_LauncherViewController_installMinecraft();
}
- (void)enterPreferences
{
LauncherPreferencesViewController *vc = [[LauncherPreferencesViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
}
@end