Macos https://dongthoigian.net/thu-thuat-may-tinh/macos-phan-mem/ Khám phá những thủ thuật máy tính Tue, 03 Jan 2023 05:40:48 +0000 vi hourly 1 https://wordpress.org/?v=6.7 https://dongthoigian.net/wp-content/uploads/2021/07/cropped-logo-dongthoigian-32x32.png Macos https://dongthoigian.net/thu-thuat-may-tinh/macos-phan-mem/ 32 32 Cách cài đặt Tensorflow trên Mac https://dongthoigian.net/cach-cai-dat-tensorflow-tren-mac/ https://dongthoigian.net/cach-cai-dat-tensorflow-tren-mac/#respond Thu, 06 Oct 2022 05:13:20 +0000 https://dongthoigian.net/?p=14890 Tôi đang sử dụng VSCode và đã cài đặt tiện ích mở rộng Python.

The post Cách cài đặt Tensorflow trên Mac appeared first on Dongthoigian.

]]>
Trong hướng dẫn này, chúng ta sẽ xem Cách cài đặt Tensorflow trên Mac. Đối với hướng dẫn này, bạn phải cài đặt  Python 3  trên máy mac của mình. Nếu không, hãy truy cập trang web python.org  và cài đặt phiên bản 3 của Python.

Ngoài ra, bạn cần có một trình soạn thảo như Visual Studio Code . Bạn luôn có thể được chào đón với PyCharm IDE. Tôi đang sử dụng VSCode và đã cài đặt tiện ích mở rộng Python.

Cách cài đặt Tensorflow trên Mac

Tôi đã cài đặt phiên bản 3 của Python. Bạn có thể kiểm tra nó bằng cách vào terminal và xem đầu ra bằng  lệnh python3 -v  .

tensorflow

Nếu bạn vẫn chưa có Python 3 và các gói khác như Nếu không, hãy cài đặt  Python ,  trình quản lý gói pip và  Virtualenv  , sau đó bạn có thể làm theo các bước dưới đây. Trước tiên, hãy cài đặt bằng   trình quản lý gói Homebrew .

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
$ brew install wget
$ cd /usr/local
$ find Cellar
Cellar/wget/1.16.1
Cellar/wget/1.16.1/bin/wget
Cellar/wget/1.16.1/share/man/man1/wget.1

$ ls -l bin
bin/wget -> ../Cellar/wget/1.16.1/bin/wget
$ brew create https://foo.com/bar-1.0.tgz
Created /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/bar.rb
$ brew edit wget # opens in $EDITOR!
class Wget < Formula
  homepage "https://www.gnu.org/software/wget/"
  url "https://ftp.gnu.org/gnu/wget/wget-1.15.tar.gz"
  sha256 "52126be8cf1bddd7536886e74c053ad7d0ed2aa89b4b630f76785bac21695fcd"

  def install
    system "./configure", "--prefix=#{prefix}"
    system "make", "install"
  end
end
$ brew install --cask firefox
$ brew create --cask foo
Editing /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask/Casks/foo.rb

Sau đó, thêm một đường dẫn toàn cục. Sửa đổi và thêm dòng sau vào trong tệp .bash_profile hoặc .zshrc

export PATH="/usr/local/bin:/usr/local/sbin:$PATH"

Nhấn từng cái một theo lệnh sau.

brew update
brew install python  # Python 3
sudo pip3 install -U virtualenv

Tạo môi trường ảo

Tôi đã tạo Môi trường ảo, nhưng bạn cũng có thể tạo theo các bước sau.

Tạo một môi trường ảo mới bằng cách chọn một trình thông dịch Python và tạo một  thư mục ./pythonenv để chứa nó. Sau đó gõ lệnh sau.

virtualenv --system-site-packages -p python3 ./pythonenv

Vào bên trong thư mục đó.

cd pythonenv

Kích hoạt môi trường ảo bằng lệnh shell cụ thể.

source bin/activate

Nếu bạn đã cài đặt hoàn hảo môi trường ảo thì virtualenv đang hoạt động, dấu nhắc trình bao của bạn có tiền tố là ( pythonenv ). Xem hình ảnh bên dưới.

Tensorflow

Cài đặt các gói trong môi trường ảo mà không ảnh hưởng đến thiết lập hệ thống máy chủ. Bắt đầu bằng cách nâng cấp pip. Xem lệnh sau để nâng cấp pip.

pip install –upgrade pip

Sau đó, bạn có thể xem tất cả các gói bằng cách gõ lệnh sau.

pip list
Tensorflow

Bạn có thể thấy rằng, tôi đã cài đặt  gói TensorFlow.

Cài đặt gói pip TensorFlow Nếu hệ thống của bạn không có gói tensorflow thì bạn có thể cài đặt nó bằng lệnh sau.

pip install tensorflow

Về cơ bản, các gói phụ thuộc đã được cài đặt sẵn, nếu bạn chưa có phiên bản tensorflow mới hơn thì bạn có thể nâng cấp bằng lệnh sau.

pip install --upgrade tensorflow

Vì vậy, cuối cùng, Tensorflow đã được cài đặt trên máy của bạn.

Hãy kiểm tra xem nó đã được cài đặt hay chưa.

Tạo một thư mục mới bên trong  thư mục pythonenv  có tên là  tflow  và bên trong đó, tạo một tệp mới có tên  tflow.py  và thêm mã sau vào bên trong nó.

import tensorflow as tf
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

hello = tf.constant('Kudos, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

Trong đoạn mã trên, chúng tôi đã nhập tensorflow cũng như mô-đun os .

Nếu bạn không nhập mô-đun hệ điều hành và sử dụng  chức năng môi trường  thì nó sẽ đưa ra cảnh báo và tránh cảnh báo, chúng tôi đã áp dụng cài đặt xuất TF_CPP_MIN_LOG_LEVEL = 2.

Để biết thêm thông tin, bạn có thể xem liên kết StackOverflow này .

Cuối cùng, chạy  tệp tflow.py  bằng lệnh sau và xem kết quả.

python3 tflow.py
Tensorflow

Nếu bạn đã thấy như thế này thì xin chúc mừng. Bạn đã cài đặt thành công Tensorflow trên máy mac của mình.

The post Cách cài đặt Tensorflow trên Mac appeared first on Dongthoigian.

]]>
https://dongthoigian.net/cach-cai-dat-tensorflow-tren-mac/feed/ 0
iOS – Quản lý bộ nhớ https://dongthoigian.net/ios-quan-ly-bo-nho/ https://dongthoigian.net/ios-quan-ly-bo-nho/#respond Fri, 28 Jan 2022 06:32:18 +0000 https://dongthoigian.net/?p=10738 Theo tài liệu của Apple, hai vấn đề chính trong quản lý bộ nhớ là

The post iOS – Quản lý bộ nhớ appeared first on Dongthoigian.

]]>
Quản lý bộ nhớ trong iOS ban đầu không phải là ARC (Đếm tham chiếu tự động), nơi chúng tôi phải giữ lại và giải phóng các đối tượng. Bây giờ, nó hỗ trợ ARC và chúng tôi không phải giữ lại và giải phóng các đối tượng. Xcode tự động xử lý công việc trong thời gian biên dịch.

Các vấn đề về quản lý bộ nhớ

Theo tài liệu của Apple, hai vấn đề chính trong quản lý bộ nhớ là:

  • Giải phóng hoặc ghi đè dữ liệu vẫn đang được sử dụng. Nó gây ra hỏng bộ nhớ và thường dẫn đến ứng dụng của bạn bị treo, hoặc tệ hơn, dữ liệu người dùng bị hỏng.
  • Không giải phóng dữ liệu không còn sử dụng gây rò rỉ bộ nhớ. Khi bộ nhớ được cấp phát không được giải phóng mặc dù nó sẽ không bao giờ được sử dụng lại, nó được gọi là rò rỉ bộ nhớ. Rò rỉ khiến ứng dụng của bạn sử dụng lượng bộ nhớ ngày càng tăng, do đó có thể dẫn đến hiệu suất hệ thống kém hoặc (trong iOS) ứng dụng của bạn bị chấm dứt.

Quy tắc quản lý bộ nhớ

  • Chúng tôi sở hữu các đối tượng mà chúng tôi tạo ra và sau đó chúng tôi phải giải phóng chúng khi chúng không còn cần thiết nữa.
  • Sử dụng Giữ lại để giành quyền sở hữu đối tượng mà bạn không tạo. Bạn cũng phải giải phóng những đối tượng này khi chúng không cần thiết.
  • Đừng phát hành các đối tượng mà bạn không sở hữu.

Xử lý bộ nhớ trong ARC

Bạn không cần phải sử dụng bản phát hành và giữ lại trong ARC. Vì vậy, tất cả các đối tượng của bộ điều khiển chế độ xem sẽ được giải phóng khi bộ điều khiển chế độ xem được gỡ bỏ. Tương tự, các đối tượng con của bất kỳ đối tượng nào sẽ được giải phóng khi chúng được giải phóng. Lưu ý rằng nếu các lớp khác có một tham chiếu mạnh đến một đối tượng của một lớp, thì toàn bộ lớp đó sẽ không được giải phóng. Vì vậy, nên sử dụng các thuộc tính yếu kém cho các đại biểu.

Công cụ quản lý bộ nhớ

Chúng tôi có thể phân tích việc sử dụng bộ nhớ với sự trợ giúp của các công cụ công cụ Xcode. Nó bao gồm các công cụ như Activity Monitor, Allocations, Leaks, Zombies, v.v.

Các bước để phân tích phân bổ bộ nhớ

Bước 1 – Mở một ứng dụng hiện có.

Bước 2 – Chọn Sản phẩm rồi đến Hồ sơ như hình bên dưới.

iOS - Quản lý bộ nhớ

Bước 3 – Chọn Phân bổ trong màn hình tiếp theo được hiển thị bên dưới và chọn Hồ sơ.

iOS - Quản lý bộ nhớ

Bước 4 – Chúng ta sẽ thấy việc phân bổ bộ nhớ cho các đối tượng khác nhau như hình bên dưới.

Bước 5 – Bạn có thể chuyển đổi giữa các bộ điều khiển chế độ xem và kiểm tra xem bộ nhớ có được giải phóng đúng cách hay không.

iOS - Quản lý bộ nhớ

Bước 6 – Tương tự, thay vì Allocations, chúng ta có thể sử dụng Activity Monitor để xem tổng thể bộ nhớ được phân bổ cho ứng dụng.

iOS - Quản lý bộ nhớ

Bước 7 – Các công cụ này giúp chúng tôi truy cập mức tiêu thụ bộ nhớ của mình và xác định vị trí có thể xảy ra rò rỉ.

iOS – Gỡ lỗi ứng dụng

Chúng tôi có thể mắc lỗi trong khi phát triển ứng dụng, điều này có thể dẫn đến các loại lỗi khác nhau. Để khắc phục những lỗi hoặc lỗi này, chúng ta cần gỡ lỗi ứng dụng.

Chọn một trình gỡ lỗi

Xcode có hai trình gỡ lỗi cụ thể là, trình gỡ lỗi GDB và LLDB. GDB được chọn theo mặc định. LLDB là một trình gỡ lỗi là một phần của dự án trình biên dịch mã nguồn mở LLVM. Bạn có thể thay đổi trình gỡ lỗi bằng tùy chọn “chỉnh sửa lược đồ đang hoạt động”.

Làm thế nào để tìm lỗi mã hóa?

Để xác định các lỗi liên quan đến mã hóa, bạn cần xây dựng ứng dụng của mình để biên dịch mã. Trong trường hợp mã có lỗi, trình biên dịch sẽ hiển thị tất cả các thông báo, lỗi và cảnh báo với các lý do có thể xảy ra.

Bạn có thể nhấp vào Sản phẩm và sau đó nhấp vào Phân tích để xác định các vấn đề có thể xảy ra trong một ứng dụng.

Đặt các điểm ngắt

Điểm ngắt giúp chúng ta biết các trạng thái khác nhau của các đối tượng ứng dụng của chúng ta, giúp chúng ta xác định nhiều sai sót bao gồm các vấn đề logic. Chúng ta chỉ cần nhấp vào số dòng để tạo điểm ngắt. Để loại bỏ một điểm ngắt, chỉ cần nhấp và kéo nó ra. Ảnh chụp màn hình sau đây cho thấy cách đặt điểm ngắt:

iOS - Gỡ lỗi ứng dụng

Khi chúng tôi chạy ứng dụng và chọn nút playVideo, ứng dụng sẽ tạm dừng ở số dòng mà chúng tôi đã đặt điểm ngắt. Nó cho phép chúng tôi có thời gian để phân tích trạng thái của ứng dụng. Khi điểm ngắt được kích hoạt, chúng ta sẽ nhận được kết quả như hình bên dưới.

iOS - Gỡ lỗi ứng dụng

Bạn có thể dễ dàng xác định luồng nào đã kích hoạt điểm ngắt. Ở phía dưới, bạn có thể thấy các đối tượng như self, sender, v.v., chứa các giá trị của các đối tượng tương ứng và chúng ta có thể mở rộng một số đối tượng này và xem trạng thái của từng đối tượng này là gì.

Để tiếp tục ứng dụng, chúng ta sẽ chọn nút tiếp tục (nút ngoài cùng bên trái), trong khu vực gỡ lỗi được hiển thị bên dưới. Các tùy chọn khác bao gồm bước vào, bước ra và bước qua.

Điểm ngắt ngoại lệ

Chúng tôi cũng có các điểm ngắt ngoại lệ kích hoạt ứng dụng dừng tại vị trí xảy ra ngoại lệ. Chúng tôi có thể chèn các điểm ngắt ngoại lệ bằng cách chọn nút + sau khi chọn trình điều hướng gỡ lỗi. Bạn sẽ nhận được cửa sổ sau.

iOS - Gỡ lỗi ứng dụng

Sau đó, chúng ta cần chọn Add Exception Breakpoint, cửa sổ này sẽ hiển thị như sau

iOS - Gỡ lỗi ứng dụng

Bạn có thể thu thập thêm thông tin về gỡ lỗi và các tính năng Xcode khác từ hướng dẫn sử dụng Xcode 4 

The post iOS – Quản lý bộ nhớ appeared first on Dongthoigian.

]]>
https://dongthoigian.net/ios-quan-ly-bo-nho/feed/ 0
iOS – Bố cục tự động https://dongthoigian.net/ios-bo-cuc-tu-dong/ https://dongthoigian.net/ios-bo-cuc-tu-dong/#respond Fri, 28 Jan 2022 05:08:22 +0000 https://dongthoigian.net/?p=10727 Khi chúng tôi sử dụng bố cục tự động, trong ios mục tiêu triển khai phải là 6.0 trở lên

The post iOS – Bố cục tự động appeared first on Dongthoigian.

]]>
Bố cục tự động đã được giới thiệu trong iOS 6.0. Khi chúng tôi sử dụng bố cục tự động, mục tiêu triển khai của chúng tôi phải là 6.0 trở lên. Bố cục tự động giúp chúng tôi tạo giao diện có thể được sử dụng cho nhiều hướng và nhiều thiết bị.

Mục tiêu của ví dụ của chúng tôi

Chúng tôi sẽ thêm hai nút sẽ được đặt ở một khoảng cách nhất định từ tâm màn hình. Chúng tôi cũng sẽ cố gắng thêm một trường văn bản có thể thay đổi kích thước sẽ được đặt từ một khoảng cách nhất định từ phía trên các nút.

Cách tiếp cận của chúng ta

Chúng tôi sẽ thêm một trường văn bản và hai nút trong mã cùng với các ràng buộc của chúng. Các ràng buộc của mỗi Phần tử giao diện người dùng sẽ được tạo và thêm vào chế độ xem siêu cấp. Chúng tôi sẽ phải tắt tính năng tự động thay đổi kích thước cho từng phần tử giao diện người dùng mà chúng tôi thêm vào để có được kết quả mong muốn.

Các bước liên quan

Bước 1 – Tạo một ứng dụng dựa trên chế độ xem đơn giản.

Bước 2 – Chúng tôi sẽ chỉ chỉnh sửa ViewController.m và nó như sau:

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic, strong) UIButton *leftButton;
@property (nonatomic, strong) UIButton *rightButton;
@property (nonatomic, strong) UITextField *textfield;

@end
@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
   UIView *superview = self.view;

   /*1. Create leftButton and add to our view*/
   self.leftButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
   self.leftButton.translatesAutoresizingMaskIntoConstraints = NO;
   [self.leftButton setTitle:@"LeftButton" forState:UIControlStateNormal];
   [self.view addSubview:self.leftButton];

   /* 2. Constraint to position LeftButton's X*/
   NSLayoutConstraint *leftButtonXConstraint = [NSLayoutConstraint 
   constraintWithItem:self.leftButton attribute:NSLayoutAttributeCenterX 
   relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:superview attribute:
   NSLayoutAttributeCenterX multiplier:1.0 constant:-60.0f];

   /* 3. Constraint to position LeftButton's Y*/
   NSLayoutConstraint *leftButtonYConstraint = [NSLayoutConstraint 
   constraintWithItem:self.leftButton attribute:NSLayoutAttributeCenterY 
   relatedBy:NSLayoutRelationEqual toItem:superview attribute:
   NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f];

   /* 4. Add the constraints to button's superview*/
   [superview addConstraints:@[ leftButtonXConstraint,
   leftButtonYConstraint]];

   /*5. Create rightButton and add to our view*/
   self.rightButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
   self.rightButton.translatesAutoresizingMaskIntoConstraints = NO;
   [self.rightButton setTitle:@"RightButton" forState:UIControlStateNormal];
   [self.view addSubview:self.rightButton];

   /*6. Constraint to position RightButton's X*/
   NSLayoutConstraint *rightButtonXConstraint = [NSLayoutConstraint 
   constraintWithItem:self.rightButton attribute:NSLayoutAttributeCenterX 
   relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:superview attribute:
   NSLayoutAttributeCenterX multiplier:1.0 constant:60.0f];

   /*7. Constraint to position RightButton's Y*/
   rightButtonXConstraint.priority = UILayoutPriorityDefaultHigh;
   NSLayoutConstraint *centerYMyConstraint = [NSLayoutConstraint 
   constraintWithItem:self.rightButton attribute:NSLayoutAttributeCenterY 
   relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:superview attribute:
   NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f];
   [superview addConstraints:@[centerYMyConstraint,
   rightButtonXConstraint]];

   //8. Add Text field
   self.textfield = [[UITextField alloc]initWithFrame:
   CGRectMake(0, 100, 100, 30)];
   self.textfield.borderStyle = UITextBorderStyleRoundedRect;
   self.textfield.translatesAutoresizingMaskIntoConstraints = NO;
   [self.view addSubview:self.textfield];

   //9. Text field Constraints
   NSLayoutConstraint *textFieldTopConstraint = [NSLayoutConstraint 
   constraintWithItem:self.textfield attribute:NSLayoutAttributeTop 
   relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:superview 
   attribute:NSLayoutAttributeTop multiplier:1.0 constant:60.0f];
   NSLayoutConstraint *textFieldBottomConstraint = [NSLayoutConstraint 
   constraintWithItem:self.textfield attribute:NSLayoutAttributeTop 
   relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:self.rightButton 
   attribute:NSLayoutAttributeTop multiplier:0.8 constant:-60.0f];
   NSLayoutConstraint *textFieldLeftConstraint = [NSLayoutConstraint 
   constraintWithItem:self.textfield attribute:NSLayoutAttributeLeft 
   relatedBy:NSLayoutRelationEqual toItem:superview attribute:
   NSLayoutAttributeLeft multiplier:1.0 constant:30.0f];
   NSLayoutConstraint *textFieldRightConstraint = [NSLayoutConstraint 
   constraintWithItem:self.textfield attribute:NSLayoutAttributeRight 
   relatedBy:NSLayoutRelationEqual toItem:superview attribute:
   NSLayoutAttributeRight multiplier:1.0 constant:-30.0f];
   [superview addConstraints:@[textFieldBottomConstraint ,
   textFieldLeftConstraint, textFieldRightConstraint, 
   textFieldTopConstraint]];
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}
@end

Điểm cần lưu ý

Trong các bước được đánh dấu 1, 5 và 8, chúng tôi chỉ cần thêm hai nút và một trường văn bản tương ứng theo chương trình.

Trong phần còn lại của các bước, chúng tôi đã tạo các ràng buộc và thêm các ràng buộc đó vào các siêu khung nhìn tương ứng, chúng thực sự là các khung nhìn tự. Các ràng buộc của một trong các nút bên trái như hình dưới đây:

NSLayoutConstraint *leftButtonXConstraint = [NSLayoutConstraint 
constraintWithItem:self.leftButton attribute:NSLayoutAttributeCenterX 
relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:superview attribute:
NSLayoutAttributeCenterX multiplier:1.0 constant:-60.0f];

Chúng tôi có bindWithItem và toItem quyết định giữa các phần tử giao diện người dùng mà chúng tôi đang tạo ràng buộc. Thuộc tính quyết định hai yếu tố được liên kết với nhau dựa trên cơ sở nào. “RelatedBy” quyết định mức độ ảnh hưởng của các thuộc tính giữa các phần tử. Hệ số nhân là hệ số nhân và hằng số sẽ được thêm vào bộ đa ghép.

Trong ví dụ trên, X của leftButton luôn lớn hơn hoặc bằng -60 pixel đối với tâm của siêu chế độ xem. Tương tự, các ràng buộc khác được xác định.

Đầu ra

Khi chúng tôi chạy ứng dụng, chúng tôi sẽ nhận được kết quả sau trên trình mô phỏng iPhone:

iOS - Bố cục tự động

Khi chúng tôi thay đổi hướng của trình mô phỏng sang hướng ngang, chúng tôi sẽ nhận được kết quả sau:

iOS - Bố cục tự động

Khi chúng tôi chạy cùng một ứng dụng trên trình mô phỏng iPhone 5, chúng tôi sẽ nhận được kết quả sau:

iOS - Bố cục tự động

Khi chúng tôi thay đổi hướng của trình mô phỏng sang hướng ngang, chúng tôi sẽ nhận được kết quả sau:

iOS - Bố cục tự động

iOS – Twitter và Facebook

Twitter đã được tích hợp trong iOS 5.0 và Facebook đã được tích hợp trong iOS 6.0 . Hướng dẫn của chúng tôi tập trung vào việc sử dụng các lớp do Apple cung cấp và các mục tiêu triển khai cho Twitter và Facebook lần lượt là iOS 5.0 và iOS 6.0.

Các bước liên quan

Bước 1 – Tạo một ứng dụng dựa trên chế độ xem đơn giản.

Bước 2 – Chọn tệp dự án của bạn, sau đó chọn mục tiêu và sau đó thêm Social.framewor k và Accounts.framework trong chọn khung công tác .

Bước 3 – Thêm hai nút có tên facebookPost và twitterPost và tạo ibActions cho chúng.

Bước 4 – Cập nhật ViewController.h như sau:

#import <Social/Social.h>
#import <Accounts/Accounts.h>
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

-(IBAction)twitterPost:(id)sender;
-(IBAction)facebookPost:(id)sender;

@end
Bước 5 - Cập nhật ViewController.m như sau:
#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

-(IBAction)facebookPost:(id)sender {
   SLComposeViewController *controller = [SLComposeViewController 
   composeViewControllerForServiceType:SLServiceTypeFacebook];
   SLComposeViewControllerCompletionHandler myBlock = 
      ^(SLComposeViewControllerResult result){
      
      if (result == SLComposeViewControllerResultCancelled) {
         NSLog(@"Cancelled");
      } else {
         NSLog(@"Done");
      }
      [controller dismissViewControllerAnimated:YES completion:nil];
   };
   controller.completionHandler = myBlock;

   //Adding the Text to the facebook post value from iOS
   [controller setInitialText:@"My test post"];

   //Adding the URL to the facebook post value from iOS
   [controller addURL:[NSURL URLWithString:@"http://www.test.com"]];

   //Adding the Text to the facebook post value from iOS
   [self presentViewController:controller animated:YES completion:nil];
}

-(IBAction)twitterPost:(id)sender {
   SLComposeViewController *tweetSheet = [SLComposeViewController 
   composeViewControllerForServiceType:SLServiceTypeTwitter];
   [tweetSheet setInitialText:@"My test tweet"];
   [self presentModalViewController:tweetSheet animated:YES];
}
@end

Đầu ra

Khi chúng tôi chạy ứng dụng và nhấp vào facebookPost, chúng tôi sẽ nhận được kết quả sau:

 facebookPost

Khi chúng ta nhấp vào twitterPost, chúng ta sẽ nhận được kết quả sau:

 facebookPost

iOS – Quản lý bộ nhớ xem thêm

The post iOS – Bố cục tự động appeared first on Dongthoigian.

]]>
https://dongthoigian.net/ios-bo-cuc-tu-dong/feed/ 0
iOS – Bảng phân cảnh https://dongthoigian.net/ios-bang-phan-canh/ https://dongthoigian.net/ios-bang-phan-canh/#respond Thu, 27 Jan 2022 10:41:00 +0000 https://dongthoigian.net/?p=10716 Bảng phân cảnh tạo tất cả các màn hình của một ứng dụng và kết nối các màn hình với nhau dưới một giao diện MainStoryboard.storyboard

The post iOS – Bảng phân cảnh appeared first on Dongthoigian.

]]>
Bảng phân cảnh được giới thiệu trong iOS 5. Khi chúng tôi sử dụng bảng phân cảnh, mục tiêu triển khai của chúng tôi phải là 5.0 trở lên. Bảng phân cảnh giúp chúng ta tạo tất cả các màn hình của một ứng dụng và kết nối các màn hình với nhau dưới một giao diện MainStoryboard.storyboard. Nó cũng giúp giảm thiểu mã hóa của bộ điều khiển chế độ xem đẩy / trình bày.

Các bước liên quan

Bước 1 – Tạo một ứng dụng xem duy nhất và đảm bảo rằng bạn chọn hộp kiểm bảng phân cảnh trong khi tạo ứng dụng.

Bước 2 – Chọn MainStoryboard.storyboard nơi bạn có thể tìm thấy bộ điều khiển chế độ xem đơn. Thêm một bộ điều khiển chế độ xem khác và cập nhật bộ điều khiển chế độ xem như được hiển thị bên dưới.

iOS - Bảng phân cảnh

Bước 3 – Bây giờ chúng ta hãy kết nối cả hai bộ điều khiển chế độ xem. Nhấp chuột phải vào nút “hiển thị phương thức” và kéo nó vào bộ điều khiển chế độ xem bên phải trong bộ điều khiển chế độ xem bên trái như hình dưới đây.

iOS - Bảng phân cảnh

Bước 4 – Chọn phương thức từ ba tùy chọn hiển thị như hình dưới đây.

iOS - Bảng phân cảnh

Bước 5 – Cập nhật ViewController.h như sau:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

-(IBAction)done:(UIStoryboardSegue *)seque;

@end

Bước 6 – Cập nhật ViewController.m như sau:

#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];	
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

-(IBAction)done:(UIStoryboardSegue *)seque {
   [self.navigationController popViewControllerAnimated:YES];
}

@end

Bước 7 – Chọn MainStoryboard.storyboard và nhấp chuột phải vào nút Exit trong bộ điều khiển chế độ xem bên phải, chọn xong và kết nối bằng nút quay lại như hình dưới đây.

iOS - Bảng phân cảnh

Đầu ra

Khi chúng tôi chạy ứng dụng trên thiết bị iPhone , chúng tôi sẽ nhận được kết quả sau:

iOS - Bảng phân cảnh

Khi chúng tôi chọn “hiển thị phương thức”, chúng tôi sẽ nhận được kết quả sau:

iOS - Bảng phân cảnh

iOS – Bố cục tự động xem thêm

The post iOS – Bảng phân cảnh appeared first on Dongthoigian.

]]>
https://dongthoigian.net/ios-bang-phan-canh/feed/ 0
iOS – Tích hợp iAd https://dongthoigian.net/ios-tich-hop-iad/ https://dongthoigian.net/ios-tich-hop-iad/#respond Wed, 26 Jan 2022 12:05:05 +0000 https://dongthoigian.net/?p=10660  iAd giúp chúng tôi kiếm doanh thu từ ứng dụng iOS.

The post iOS – Tích hợp iAd appeared first on Dongthoigian.

]]>
iAd được sử dụng để hiển thị quảng cáo, được phân phát bởi máy chủ apple. iAd giúp chúng tôi kiếm doanh thu từ ứng dụng iOS.

Tích hợp iAd – Các bước đã thực hiện

Bước 1 – Tạo một ứng dụng dựa trên chế độ xem đơn giản.

Bước 2 – Chọn tệp dự án của bạn, sau đó chọn mục tiêu và sau đó thêm iAd.framework trong chọn khung.

Bước 3 – Cập nhật ViewController.h như sau:

#import <UIKit/UIKit.h>
#import <iAd/iAd.h>

@interface ViewController : UIViewController<ADBannerViewDelegate> {
   ADBannerView *bannerView;
}
@end

Bước 4 – Cập nhật ViewController.m như sau:

#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
   bannerView = [[ADBannerView alloc]initWithFrame:
   CGRectMake(0, 0, 320, 50)];
   
   // Optional to set background color to clear color
   [bannerView setBackgroundColor:[UIColor clearColor]];
   [self.view addSubview: bannerView];
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

#pragma mark - AdViewDelegates

-(void)bannerView:(ADBannerView *)banner 
   didFailToReceiveAdWithError:(NSError *)error {
   NSLog(@"Error loading");
}

-(void)bannerViewDidLoadAd:(ADBannerView *)banner {
   NSLog(@"Ad loaded");
}

-(void)bannerViewWillLoadAd:(ADBannerView *)banner {
   NSLog(@"Ad will load");
}

-(void)bannerViewActionDidFinish:(ADBannerView *)banner {
   NSLog(@"Ad did finish");
}
@end

Đầu ra

Khi chúng tôi chạy ứng dụng, chúng tôi sẽ nhận được kết quả sau:

iOS - Tích hợp iAd

iOS – GameKit

Gamekit là một khung cung cấp bảng xếp hạng, thành tích và nhiều tính năng khác cho ứng dụng iOS. Trong hướng dẫn này, chúng tôi sẽ giải thích các bước liên quan đến việc thêm bảng thành tích và cập nhật điểm số.

Các bước liên quan

Bước 1 – Trong kết nối iTunes, hãy đảm bảo rằng bạn có một ID ứng dụng duy nhất và khi chúng tôi tạo bản cập nhật ứng dụng bằng ID gói và ký mã trong Xcode với hồ sơ cấp phép tương ứng.

Bước 2 – Tạo ứng dụng mới và cập nhật thông tin ứng dụng. Bạn có thể biết thêm về điều này trong tài liệu thêm ứng dụng mới của apple.

Bước 3 – Thiết lập bảng thành tích trong Quản lý Trung tâm trò chơi của trang ứng dụng của bạn, nơi thêm một bảng thành tích và cung cấp ID bảng thành tích và Loại điểm. Ở đây chúng tôi cung cấp ID ban lãnh đạo dưới dạng hướng dẫnPoint.

Bước 4 – Các bước tiếp theo liên quan đến xử lý mã và tạo giao diện người dùng cho ứng dụng của chúng tôi.

Bước 5 – Tạo một ứng dụng xem duy nhất và nhập số nhận dạng gói là số nhận dạng được chỉ định trong kết nối iTunes .

Bước 6 – Cập nhật ViewController.xib như hình dưới đây

iOS - Tích hợp iAd

Bước 7 – Chọn tệp dự án của bạn, sau đó chọn mục tiêu và sau đó thêm GameKit.framework .

Bước 8 – Tạo IBActions cho các nút chúng ta đã thêm.

Bước 9 – Cập nhật tệp ViewController.h như sau:

#import <UIKit/UIKit.h>
#import <GameKit/GameKit.h>

@interface ViewController : UIViewController
<GKLeaderboardViewControllerDelegate>

-(IBAction)updateScore:(id)sender;
-(IBAction)showLeaderBoard:(id)sender;

@end

Bước 10 – Cập nhật ViewController.m như sau:

#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
   if([GKLocalPlayer localPlayer].authenticated == NO) {
      [[GKLocalPlayer localPlayer] 
      authenticateWithCompletionHandler:^(NSError *error) {
         NSLog(@"Error%@",error);
      }];
   }    
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

- (void) updateScore: (int64_t) score 
   forLeaderboardID: (NSString*) category {
   GKScore *scoreObj = [[GKScore alloc]
   initWithCategory:category];
   scoreObj.value = score;
   scoreObj.context = 0;
   
   [scoreObj reportScoreWithCompletionHandler:^(NSError *error) {
      // Completion code can be added here
      UIAlertView *alert = [[UIAlertView alloc]
      initWithTitle:nil message:@"Score Updated Succesfully" 
      delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
      [alert show];
   }];
}

-(IBAction)updateScore:(id)sender {
   [self updateScore:200 forLeaderboardID:@"tutorialsPoint"];
}

-(IBAction)showLeaderBoard:(id)sender {
   GKLeaderboardViewController *leaderboardViewController =
   [[GKLeaderboardViewController alloc] init];
   leaderboardViewController.leaderboardDelegate = self;
   [self presentModalViewController:
   leaderboardViewController animated:YES];
}

#pragma mark - Gamekit delegates
- (void)leaderboardViewControllerDidFinish:
(GKLeaderboardViewController *)viewController {
   [self dismissModalViewControllerAnimated:YES];
}
@end

Đầu ra

Khi chúng tôi chạy ứng dụng, chúng tôi sẽ nhận được kết quả sau:

iOS - Tích hợp iAd

Khi chúng tôi nhấp vào “hiển thị bảng lãnh đạo”, chúng tôi sẽ nhận được một màn hình tương tự như sau:

iOS - Tích hợp iAd

Khi chúng tôi nhấp vào “cập nhật điểm”, điểm sẽ được cập nhật vào bảng xếp hạng của chúng tôi và chúng tôi sẽ nhận được thông báo như hình dưới đây

iOS - Tích hợp iAd

iOS – Bảng phân cảnh xem thêm

The post iOS – Tích hợp iAd appeared first on Dongthoigian.

]]>
https://dongthoigian.net/ios-tich-hop-iad/feed/ 0
iOS – Mua Trong Ứng Dụng https://dongthoigian.net/ios-mua-trong-ung-dung/ https://dongthoigian.net/ios-mua-trong-ung-dung/#respond Wed, 26 Jan 2022 11:54:40 +0000 https://dongthoigian.net/?p=10653 Mua trong ứng dụng được sử dụng để mua nội dung bổ sung hoặc nâng cấp các tính năng ios

The post iOS – Mua Trong Ứng Dụng appeared first on Dongthoigian.

]]>
Mua trong ứng dụng được sử dụng để mua nội dung bổ sung hoặc nâng cấp các tính năng liên quan đến ứng dụng.

Các bước liên quan

Bước 1 – Trong kết nối iTunes, hãy đảm bảo rằng bạn có một ID ứng dụng duy nhất và khi chúng tôi tạo bản cập nhật ứng dụng bằng ID gói và ký mã trong Xcode với hồ sơ cấp phép tương ứng.

Bước 2 – Tạo ứng dụng mới và cập nhật thông tin ứng dụng. Bạn có thể biết thêm về điều này trong tài liệu Thêm ứng dụng mới của apple .

Bước 3 – Thêm sản phẩm mới để mua trong ứng dụng trong Quản lý mua trong ứng dụng của trang ứng dụng của bạn.

Bước 4 – Đảm bảo bạn thiết lập chi tiết ngân hàng cho ứng dụng của mình. Điều này cần được thiết lập để mua hàng trong ứng dụng hoạt động. Ngoài ra, hãy tạo tài khoản người dùng thử nghiệm bằng cách sử dụng tùy chọn Quản lý người dùng trong trang kết nối iTunes của ứng dụng của bạn.

Bước 5 – Các bước tiếp theo liên quan đến xử lý mã và tạo giao diện người dùng cho giao dịch mua trong ứng dụng của chúng tôi.

Bước 6 – Tạo một ứng dụng xem duy nhất và nhập số nhận dạng gói là số nhận dạng được chỉ định trong kết nối iTunes.

Bước 7 – Cập nhật ViewController.xib như hình dưới đây

iOS - Mua trong ứng dụng

Bước 8 – Tạo IBOutlets cho ba nhãn và nút đặt tên cho chúng lần lượt là productTitleLabel, productDescriptionLabel, productPriceLabel và buyButton.

Bước 9 – Chọn tệp dự án của bạn, sau đó chọn mục tiêu và sau đó thêm StoreKit.framework .

Bước 10 – Cập nhật ViewController.h như sau:

#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>

@interface ViewController : UIViewController<
SKProductsRequestDelegate,SKPaymentTransactionObserver> {
   SKProductsRequest *productsRequest;
   NSArray *validProducts;
   UIActivityIndicatorView *activityIndicatorView;
   IBOutlet UILabel *productTitleLabel;
   IBOutlet UILabel *productDescriptionLabel;
   IBOutlet UILabel *productPriceLabel;
   IBOutlet UIButton *purchaseButton;
}

- (void)fetchAvailableProducts;
- (BOOL)canMakePurchases;
- (void)purchaseMyProduct:(SKProduct*)product;
- (IBAction)purchase:(id)sender;

@end

Bước 11 – Cập nhật ViewController.m như sau:

#import "ViewController.h"
#define kTutorialPointProductID 
@"com.tutorialPoints.testApp.testProduct"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
   
   // Adding activity indicator
   activityIndicatorView = [[UIActivityIndicatorView alloc]
   initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
   activityIndicatorView.center = self.view.center;
   [activityIndicatorView hidesWhenStopped];
   [self.view addSubview:activityIndicatorView];
   [activityIndicatorView startAnimating];
   
   //Hide purchase button initially
   purchaseButton.hidden = YES;
   [self fetchAvailableProducts];
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

-(void)fetchAvailableProducts {
   NSSet *productIdentifiers = [NSSet 
   setWithObjects:kTutorialPointProductID,nil];
   productsRequest = [[SKProductsRequest alloc] 
   initWithProductIdentifiers:productIdentifiers];
   productsRequest.delegate = self;
   [productsRequest start];
}

- (BOOL)canMakePurchases {
   return [SKPaymentQueue canMakePayments];
}

- (void)purchaseMyProduct:(SKProduct*)product {
   if ([self canMakePurchases]) {
      SKPayment *payment = [SKPayment paymentWithProduct:product];
      [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
      [[SKPaymentQueue defaultQueue] addPayment:payment];
   } else {
      UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:
      @"Purchases are disabled in your device" message:nil delegate:
      self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
      [alertView show];
   }
}
-(IBAction)purchase:(id)sender {
   [self purchaseMyProduct:[validProducts objectAtIndex:0]];
   purchaseButton.enabled = NO; 
}

#pragma mark StoreKit Delegate

-(void)paymentQueue:(SKPaymentQueue *)queue 
updatedTransactions:(NSArray *)transactions {
   for (SKPaymentTransaction *transaction in transactions) {
      switch (transaction.transactionState) {
         case SKPaymentTransactionStatePurchasing:
            NSLog(@"Purchasing");
         break;
         
         case SKPaymentTransactionStatePurchased:
            if ([transaction.payment.productIdentifier 
            isEqualToString:kTutorialPointProductID]) {
               NSLog(@"Purchased ");
               UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:
               @"Purchase is completed succesfully" message:nil delegate:
               self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
               [alertView show];
            }
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
         break;
            
         case SKPaymentTransactionStateRestored:
            NSLog(@"Restored ");
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
         break;
            
         case SKPaymentTransactionStateFailed:
            NSLog(@"Purchase failed ");
         break
         default:
         break;
      }
   }
}

-(void)productsRequest:(SKProductsRequest *)request 
didReceiveResponse:(SKProductsResponse *)response {
   SKProduct *validProduct = nil;
   int count = [response.products count];
   
   if (count>0) {
      validProducts = response.products;
      validProduct = [response.products objectAtIndex:0];
      
      if ([validProduct.productIdentifier 
         isEqualToString:kTutorialPointProductID]) {
         [productTitleLabel setText:[NSString stringWithFormat:
            @"Product Title: %@",validProduct.localizedTitle]];
         [productDescriptionLabel setText:[NSString stringWithFormat:
            @"Product Desc: %@",validProduct.localizedDescription]];
         [productPriceLabel setText:[NSString stringWithFormat:
            @"Product Price: %@",validProduct.price]];
      }
   } else {
      UIAlertView *tmp = [[UIAlertView alloc]
         initWithTitle:@"Not Available"
         message:@"No products to purchase"
         delegate:self
         cancelButtonTitle:nil
         otherButtonTitles:@"Ok", nil];
         [tmp show];
   }
   
   [activityIndicatorView stopAnimating];
   purchaseButton.hidden = NO;
}
@end

Ghi chú

Bạn phải cập nhật kTutorialPointProductID thành productID bạn đã tạo cho Mua hàng trong ứng dụng của mình. Bạn có thể thêm nhiều sản phẩm bằng cách cập nhật NSSet của productIdentifier trong fetchAvailableProducts. Tương tự, xử lý các hành động liên quan đến mua hàng cho các ID sản phẩm bạn thêm.

Đầu ra

Khi chúng tôi chạy ứng dụng, chúng tôi sẽ nhận được kết quả sau:

h productID bạn đã tạo cho Mua hàng trong ứng dụng

Đảm bảo bạn đã đăng xuất khỏi tài khoản của mình trong màn hình cài đặt. Khi nhấp vào Bắt đầu mua, hãy chọn Sử dụng ID Apple Hiện tại. Nhập tên người dùng và mật khẩu tài khoản thử nghiệm hợp lệ của bạn. Bạn sẽ được hiển thị cảnh báo sau trong vài giây.

 Sử dụng ID Apple Hiện tại

Khi sản phẩm của bạn được mua thành công, bạn sẽ nhận được cảnh báo sau. Bạn có thể thấy mã liên quan để cập nhật các tính năng ứng dụng nơi chúng tôi hiển thị cảnh báo này.

 Sử dụng ID Apple Hiện tại

iOS – Tích hợp iAd xem thêm

The post iOS – Mua Trong Ứng Dụng appeared first on Dongthoigian.

]]>
https://dongthoigian.net/ios-mua-trong-ung-dung/feed/ 0
iOS – Âm thanh và Video https://dongthoigian.net/ios-am-thanh-va-video/ https://dongthoigian.net/ios-am-thanh-va-video/#respond Mon, 24 Jan 2022 08:29:47 +0000 https://dongthoigian.net/?p=10556 Tìm hiểu Âm thanh và video khá phổ biến trong các thiết bị mới nhất. Nó được hỗ trợ trong iOS

The post iOS – Âm thanh và Video appeared first on Dongthoigian.

]]>
Âm thanh và video khá phổ biến trong các thiết bị mới nhất. Nó được hỗ trợ trong iOS với sự trợ giúp của AVFoundation.framework và MediaPlayer.framework tương ứng.

Các bước liên quan

Bước 1 – Tạo một ứng dụng dựa trên Chế độ xem đơn giản .

Bước 2 – Chọn tệp dự án của bạn, chọn mục tiêu, sau đó chúng ta nên thêm AVFoundation.framework và MediaPlayer.framework .

Bước 3 – Thêm hai nút trong ViewController.xib và tạo một hành động để phát âm thanh và video tương ứng.

Bước 4 – Cập nhật ViewController.h như sau:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>

@interface ViewController : UIViewController {
   AVAudioPlayer *audioPlayer;
   MPMoviePlayerViewController *moviePlayer;
}
-(IBAction)playAudio:(id)sender;
-(IBAction)playVideo:(id)sender;
@end

Bước 5 – Cập nhật ViewController.m như sau:

#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

-(IBAction)playAudio:(id)sender {
   NSString *path = [[NSBundle mainBundle]
   pathForResource:@"audioTest" ofType:@"mp3"];
   audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:
   [NSURL fileURLWithPath:path] error:NULL];
   [audioPlayer play];
}

-(IBAction)playVideo:(id)sender {
   NSString *path = [[NSBundle mainBundle]pathForResource:
   @"videoTest" ofType:@"mov"];
   moviePlayer = [[MPMoviePlayerViewController 
   alloc]initWithContentURL:[NSURL fileURLWithPath:path]];
   [self presentModalViewController:moviePlayer animated:NO];
}
@end

Ghi chú

Chúng tôi cần thêm các tệp âm thanh và video để đảm bảo rằng chúng tôi nhận được đầu ra như mong đợi.

Đầu ra

Khi chúng tôi chạy ứng dụng, chúng tôi sẽ nhận được kết quả sau

iOS - Âm thanh và Video

Khi chúng ta nhấp vào phát video, chúng ta sẽ nhận được đầu ra như hình dưới đây:

iOS - Âm thanh và Video

Khi chúng tôi nhấp vào phát âm thanh, bạn sẽ nghe thấy âm thanh.

iOS – Xử lý tệp

Việc xử lý tệp không thể được giải thích trực quan với ứng dụng và do đó các phương pháp chính được sử dụng để xử lý tệp được giải thích bên dưới. Lưu ý rằng gói ứng dụng chỉ có quyền đọc và chúng tôi sẽ không thể sửa đổi các tệp. Bạn vẫn có thể sửa đổi thư mục tài liệu của ứng dụng của mình.

Các phương pháp được sử dụng trong xử lý tệp

Các phương pháp được sử dụng để truy cập và thao tác các tệp được thảo luận dưới đây. Ở đây chúng ta phải thay thế các chuỗi FilePath1, FilePath2 và FilePath thành các đường dẫn tệp đầy đủ theo yêu cầu của chúng ta để có được hành động mong muốn. Kiểm tra xem tệp có tồn tại ở đường dẫn hay không

Việc xử lý tệp không thể được giải thích trực quan với ứng dụng và do đó các phương pháp chính được sử dụng để xử lý tệp được giải thích bên dưới. Lưu ý rằng gói ứng dụng chỉ có quyền đọc và chúng tôi sẽ không thể sửa đổi các tệp. Bạn vẫn có thể sửa đổi thư mục tài liệu của ứng dụng của mình.
Các phương pháp được sử dụng trong xử lý tệp
Các phương pháp được sử dụng để truy cập và thao tác các tệp được thảo luận dưới đây. Ở đây chúng ta phải thay thế các chuỗi FilePath1, FilePath2 và FilePath thành các đường dẫn tệp đầy đủ theo yêu cầu của chúng ta để có được hành động mong muốn.
Kiểm tra xem tệp có tồn tại ở đường dẫn hay không
NSFileManager *fileManager = [NSFileManager defaultManager];

//Get documents directory
NSArray *directoryPaths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [directoryPaths objectAtIndex:0];

if ([fileManager fileExistsAtPath:@""]==YES) {
   NSLog(@"File exists");
}

So sánh hai nội dung tệp

if ([fileManager contentsEqualAtPath:@"FilePath1" andPath:@" FilePath2"]) {
   NSLog(@"Same content");
}

Kiểm tra xem có thể ghi, đọc được và có thể thực thi hay không

if ([fileManager isWritableFileAtPath:@"FilePath"]) {
   NSLog(@"isWritable");
}

if ([fileManager isReadableFileAtPath:@"FilePath"]) {
   NSLog(@"isReadable");
}

if ( [fileManager isExecutableFileAtPath:@"FilePath"]) {
   NSLog(@"is Executable");
}

Di chuyển tệp tin

if([fileManager moveItemAtPath:@"FilePath1" 
   toPath:@"FilePath2" error:NULL]) {
   NSLog(@"Moved successfully");
}

Sao chép tệp

if ([fileManager copyItemAtPath:@"FilePath1" 
   toPath:@"FilePath2"  error:NULL]) {
   NSLog(@"Copied successfully");
}

Xóa tệp

if ([fileManager removeItemAtPath:@"FilePath" error:NULL]) {
   NSLog(@"Removed successfully");
}

Đọc tài liệu

NSData *data = [fileManager contentsAtPath:@"Path"];
[fileManager createFileAtPath:@"" contents:data attributes:nil];

iOS – Truy cập Bản đồ

Bản đồ luôn hữu ích để chúng tôi xác định vị trí địa điểm. Bản đồ được tích hợp trong iOS bằng cách sử dụng khung MapKit.

Các bước liên quan

Bước 1 – Tạo một ứng dụng dựa trên chế độ xem đơn giản.

Bước 2 – Chọn tệp dự án của bạn, sau đó chọn mục tiêu và sau đó thêm MapKit.framework.

Bước 3 – Chúng ta cũng nên thêm Corelocation.framework.

Bước 4 – Thêm MapView vào ViewController.xib và tạo một ibOutlet và đặt tên là mapView.

Bước 5 – Tạo một tệp mới bằng cách chọn Tệp → Mới → Tệp … → chọn lớp Objective C và nhấp vào tiếp theo.

Bước 6 – Đặt tên lớp là MapAnnotation với “lớp con của” là NSObject.

Bước 7 – Chọn tạo.

Bước 8 – Cập nhật MapAnnotation.h như sau:

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface MapAnnotation : NSObject<MKAnnotation>
@property (nonatomic, strong) NSString *title;
@property (nonatomic, readwrite) CLLocationCoordinate2D coordinate;

- (id)initWithTitle:(NSString *)title andCoordinate:
   (CLLocationCoordinate2D)coordinate2d;

@end

Bước 9 – Cập nhật MapAnnotation.m như sau:

#import "MapAnnotation.h"

@implementation MapAnnotation
-(id)initWithTitle:(NSString *)title andCoordinate:
   (CLLocationCoordinate2D)coordinate2d {
  
   self.title = title;
   self.coordinate =coordinate2d;
   return self;
}
@end

Bước 10 – Cập nhật ViewController.h như sau:

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>

@interface ViewController : UIViewController<MKMapViewDelegate> {
   MKMapView *mapView;
}
@end

Bước 11 – Cập nhật ViewController.m như sau:

#import "ViewController.h"
#import "MapAnnotation.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
   mapView = [[MKMapView alloc]initWithFrame:
   CGRectMake(10, 100, 300, 300)];
   mapView.delegate = self;
   mapView.centerCoordinate = CLLocationCoordinate2DMake(37.32, -122.03);
   mapView.mapType = MKMapTypeHybrid;
   CLLocationCoordinate2D location;
   location.latitude = (double) 37.332768;
   location.longitude = (double) -122.030039;
   
   // Add the annotation to our map view
   MapAnnotation *newAnnotation = [[MapAnnotation alloc]
   initWithTitle:@"Apple Head quaters" andCoordinate:location];
   [mapView addAnnotation:newAnnotation];
   CLLocationCoordinate2D location2;
   location2.latitude = (double) 37.35239;
   location2.longitude = (double) -122.025919;
   MapAnnotation *newAnnotation2 = [[MapAnnotation alloc] 
   initWithTitle:@"Test annotation" andCoordinate:location2];
   [mapView addAnnotation:newAnnotation2];
   [self.view addSubview:mapView];
}

// When a map annotation point is added, zoom to it (1500 range)
- (void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views {
   MKAnnotationView *annotationView = [views objectAtIndex:0];
   id <MKAnnotation> mp = [annotationView annotation];
   MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance
   ([mp coordinate], 1500, 1500);
   [mv setRegion:region animated:YES];
   [mv selectAnnotation:mp animated:YES];
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}
@end

Đầu ra

Khi chúng tôi chạy ứng dụng, chúng tôi sẽ nhận được đầu ra như hình dưới đây –

iOS - Truy cập Bản đồ

Khi cuộn bản đồ lên, chúng ta sẽ nhận được kết quả như hình dưới đây

iOS - Truy cập Bản đồ

iOS – Mua trong ứng dụng xem thêm

The post iOS – Âm thanh và Video appeared first on Dongthoigian.

]]>
https://dongthoigian.net/ios-am-thanh-va-video/feed/ 0
iOS – Cơ sở dữ liệu SQLite https://dongthoigian.net/ios-co-so-du-lieu-sqlite/ https://dongthoigian.net/ios-co-so-du-lieu-sqlite/#respond Mon, 24 Jan 2022 08:02:43 +0000 https://dongthoigian.net/?p=10548 Tìm hiểu iOS - Cơ sở dữ liệu SQLite

The post iOS – Cơ sở dữ liệu SQLite appeared first on Dongthoigian.

]]>
SQLite có thể được sử dụng trong iOS để xử lý dữ liệu. Nó sử dụng các truy vấn sqlite, điều này giúp những người biết SQL dễ dàng hơn.

Các bước liên quan

Bước 1 – Tạo một ứng dụng dựa trên Chế độ xem đơn giản .

Bước 2 – Chọn tệp dự án của bạn, sau đó chọn mục tiêu và sau đó thêm thư viện libsqlite3.dylib trong chọn khuôn khổ.

Bước 3 – Tạo một tệp mới bằng cách chọn Tệp → Mới → Tệp … → chọn lớp Objective C và nhấp vào tiếp theo.

Bước 4 – Đặt tên lớp là DBManager với “lớp con của” là NSObject.

Bước 5 – Chọn tạo.

Bước 6 – Cập nhật DBManager.h như sau:

#import <Foundation/Foundation.h>
#import <sqlite3.h>

@interface DBManager : NSObject {
   NSString *databasePath;
}

+(DBManager*)getSharedInstance;
-(BOOL)createDB;
-(BOOL) saveData:(NSString*)registerNumber name:(NSString*)name 
   department:(NSString*)department year:(NSString*)year;
-(NSArray*) findByRegisterNumber:(NSString*)registerNumber;

@end

Bước 7 – Cập nhật DBManager.m như sau:

#import "DBManager.h"
static DBManager *sharedInstance = nil;
static sqlite3 *database = nil;
static sqlite3_stmt *statement = nil;

@implementation DBManager

+(DBManager*)getSharedInstance {
   if (!sharedInstance) {
      sharedInstance = [[super allocWithZone:NULL]init];
      [sharedInstance createDB];
   }
   return sharedInstance;
}

-(BOOL)createDB {
   NSString *docsDir;
   NSArray *dirPaths;
   
   // Get the documents directory
   dirPaths = NSSearchPathForDirectoriesInDomains
   (NSDocumentDirectory, NSUserDomainMask, YES);
   docsDir = dirPaths[0];
   
   // Build the path to the database file
   databasePath = [[NSString alloc] initWithString: 
   [docsDir stringByAppendingPathComponent: @"student.db"]];
   BOOL isSuccess = YES;
   NSFileManager *filemgr = [NSFileManager defaultManager];
   
   if ([filemgr fileExistsAtPath: databasePath ] == NO) {
      const char *dbpath = [databasePath UTF8String];
      if (sqlite3_open(dbpath, &database) == SQLITE_OK) {
         char *errMsg;
         const char *sql_stmt =
         "create table if not exists studentsDetail (regno integer 
         primary key, name text, department text, year text)";
         
         if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) {
            isSuccess = NO;
            NSLog(@"Failed to create table");
         }
         sqlite3_close(database);
         return  isSuccess;
      } else {
         isSuccess = NO;
         NSLog(@"Failed to open/create database");
      }
   }    
   return isSuccess;
}

- (BOOL) saveData:(NSString*)registerNumber name:(NSString*)name 
   department:(NSString*)department year:(NSString*)year; {
   const char *dbpath = [databasePath UTF8String];
   
   if (sqlite3_open(dbpath, &database) == SQLITE_OK) {
      NSString *insertSQL = [NSString stringWithFormat:@"insert into
      studentsDetail (regno,name, department, year) values
      (\"%d\",\"%@\", \"%@\", \"%@\")",[registerNumber integerValue],
      name, department, year];        
      const char *insert_stmt = [insertSQL UTF8String];
      sqlite3_prepare_v2(database, insert_stmt,-1, &statement, NULL);
      
      if (sqlite3_step(statement) == SQLITE_DONE) {
         return YES;
      } else {
         return NO;
      }
      sqlite3_reset(statement);
   }
   return NO;
}

- (NSArray*) findByRegisterNumber:(NSString*)registerNumber {
   const char *dbpath = [databasePath UTF8String];
   
   if (sqlite3_open(dbpath, &database) == SQLITE_OK) {
      NSString *querySQL = [NSString stringWithFormat:
      @"select name, department, year from studentsDetail where 
      regno=\"%@\"",registerNumber];
      const char *query_stmt = [querySQL UTF8String];
      NSMutableArray *resultArray = [[NSMutableArray alloc]init];
      
      if (sqlite3_prepare_v2(database, query_stmt, -1, &statement, NULL) == SQLITE_OK) {
         if (sqlite3_step(statement) == SQLITE_ROW) {
            NSString *name = [[NSString alloc] initWithUTF8String:
            (const char *) sqlite3_column_text(statement, 0)];
            [resultArray addObject:name];
            
            NSString *department = [[NSString alloc] initWithUTF8String:
            (const char *) sqlite3_column_text(statement, 1)];
            [resultArray addObject:department];
            
            NSString *year = [[NSString alloc]initWithUTF8String:
            (const char *) sqlite3_column_text(statement, 2)];
            [resultArray addObject:year];
            return resultArray;
         } else {
            NSLog(@"Not found");
            return nil;
         }
         sqlite3_reset(statement);
      }
   }
   return nil;
}

Bước 8 – Cập nhật tệp ViewController.xib như sau:

iOS - Cơ sở dữ liệu SQLite

Bước 9 – Tạo IBOutlet cho các trường văn bản trên.

Bước 10 – Tạo IBAction cho các nút trên.

Bước 11 – Cập nhật ViewController.h như sau:

#import <UIKit/UIKit.h>
#import "DBManager.h"

@interface ViewController : UIViewController<UITextFieldDelegate> {
   IBOutlet UITextField *regNoTextField;
   IBOutlet UITextField *nameTextField;
   IBOutlet UITextField *departmentTextField;
   IBOutlet UITextField *yearTextField;
   IBOutlet UITextField *findByRegisterNumberTextField;
   IBOutlet UIScrollView *myScrollView;
}

-(IBAction)saveData:(id)sender;
-(IBAction)findData:(id)sender;
@end

Bước 12 – Cập nhật ViewController.m như sau:

#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)
   nibBundleOrNil {
   self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
   
   if (self) {
      // Custom initialization
   }
   return self;
}

- (void)viewDidLoad {
   [super viewDidLoad];
   // Do any additional setup after loading the view from its nib.
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

-(IBAction)saveData:(id)sender {
   BOOL success = NO;
   NSString *alertString = @"Data Insertion failed";
   
   if (regNoTextField.text.length>0 &&nameTextField.text.length>0 &&
      departmentTextField.text.length>0 &&yearTextField.text.length>0 ) {
      success = [[DBManager getSharedInstance]saveData:
      regNoTextField.text name:nameTextField.text department:
      departmentTextField.text year:yearTextField.text];
   } else {
      alertString = @"Enter all fields";
   }     
   
   if (success == NO) {
      UIAlertView *alert = [[UIAlertView alloc]initWithTitle:
      alertString message:nil
      delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
      [alert show];
   }
}

-(IBAction)findData:(id)sender {
   NSArray *data = [[DBManager getSharedInstance]findByRegisterNumber:
   findByRegisterNumberTextField.text];
   
   if (data == nil) {
      UIAlertView *alert = [[UIAlertView alloc]initWithTitle:
      @"Data not found" message:nil delegate:nil cancelButtonTitle:
      @"OK" otherButtonTitles:nil];
      [alert show];
      regNoTextField.text = @"";
      nameTextField.text =@"";
      departmentTextField.text = @"";
      yearTextField.text =@"";
   } else {
      regNoTextField.text = findByRegisterNumberTextField.text;
      nameTextField.text =[data objectAtIndex:0];
      departmentTextField.text = [data objectAtIndex:1];
      yearTextField.text =[data objectAtIndex:2];
   }
}

#pragma mark - Text field delegate
-(void)textFieldDidBeginEditing:(UITextField *)textField {
   [myScrollView setFrame:CGRectMake(10, 50, 300, 200)];
   [myScrollView setContentSize:CGSizeMake(300, 350)];
}

-(void)textFieldDidEndEditing:(UITextField *)textField {
   [myScrollView setFrame:CGRectMake(10, 50, 300, 350)];

}

-(BOOL) textFieldShouldReturn:(UITextField *)textField {
   [textField resignFirstResponder];
   return YES;
}
@end

Đầu ra

Khi chúng tôi chạy ứng dụng, chúng tôi sẽ nhận được kết quả đầu ra sau đây, nơi chúng tôi có thể thêm và tìm thông tin chi tiết về học sinh

iOS - Cơ sở dữ liệu SQLite

iOS – Gửi Email

Chúng tôi có thể gửi email bằng ứng dụng Email của thiết bị iOS.

Các bước liên quan

Bước 1 – Tạo một ứng dụng dựa trên Chế độ xem đơn giản .

Bước 2 – Chọn tệp dự án của bạn, sau đó chọn mục tiêu và sau đó thêm MessageUI.framework .

Bước 3 – Thêm một nút trong ViewController.xib và tạo một hành động để gửi email.

Bước 4 – Cập nhật ViewController.h như sau:

#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>

@interface ViewController : UIViewController<MFMailComposeViewControllerDelegate> {
   MFMailComposeViewController *mailComposer;
}

-(IBAction)sendMail:(id)sender;

@end

Bước 5 – Cập nhật ViewController.m như sau:

#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

-(void)sendMail:(id)sender {
   mailComposer = [[MFMailComposeViewController alloc]init];
   mailComposer.mailComposeDelegate = self;
   [mailComposer setSubject:@"Test mail"];
   [mailComposer setMessageBody:@"Testing message 
   for the test mail" isHTML:NO];
   [self presentModalViewController:mailComposer animated:YES];
}

#pragma mark - mail compose delegate
-(void)mailComposeController:(MFMailComposeViewController *)controller 
   didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{
   
   if (result) {
      NSLog(@"Result : %d",result);
   }
   
   if (error) {
      NSLog(@"Error : %@",error);
   }
   
   [self dismissModalViewControllerAnimated:YES];
}
@end

Đầu ra

Khi chúng tôi chạy ứng dụng, chúng tôi sẽ nhận được kết quả sau:

iOS - Cơ sở dữ liệu SQLite

Khi nhấp vào Gửi Email, chúng tôi sẽ nhận được kết quả sau:

iOS - Cơ sở dữ liệu SQLite

iOS – Âm thanh và Video xem thêm

The post iOS – Cơ sở dữ liệu SQLite appeared first on Dongthoigian.

]]>
https://dongthoigian.net/ios-co-so-du-lieu-sqlite/feed/ 0
iOS – Quản lý máy ảnh https://dongthoigian.net/ios-quan-ly-may-anh/ https://dongthoigian.net/ios-quan-ly-may-anh/#respond Mon, 24 Jan 2022 07:50:54 +0000 https://dongthoigian.net/?p=10539 Tìm hiểu cách quản lý máy ảnh IOS

The post iOS – Quản lý máy ảnh appeared first on Dongthoigian.

]]>
Máy ảnh là một trong những tính năng phổ biến trên thiết bị di động. Chúng ta có thể chụp ảnh bằng máy ảnh và sử dụng nó trong ứng dụng của mình và nó cũng khá đơn giản.

Quản lý máy ảnh – Các bước liên quan

Bước 1 – Tạo một ứng dụng dựa trên Chế độ xem đơn giản .

Bước 2 – Thêm một nút trong ViewController.xib và tạo IBAction cho nút.

Bước 3 – Thêm một dạng xem ảnh và tạo IBOutlet đặt tên nó là imageView.

Bước 4 – Cập nhật ViewController.h như sau:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIImagePickerControllerDelegate> {
   UIImagePickerController *imagePicker;
   IBOutlet UIImageView *imageView;
}

- (IBAction)showCamera:(id)sender;
@end

Bước 5 – Cập nhật ViewController.m như sau:

Bước 5 - Cập nhật ViewController.m như sau:
#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

- (IBAction)showCamera:(id)sender {
   imagePicker.allowsEditing = YES;
   
   if ([UIImagePickerController isSourceTypeAvailable:
   UIImagePickerControllerSourceTypeCamera]) {
      imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
   } else {
      imagePicker.sourceType = 
      UIImagePickerControllerSourceTypePhotoLibrary;
   }
   [self presentModalViewController:imagePicker animated:YES];
}

-(void)imagePickerController:(UIImagePickerController *)picker 
   didFinishPickingMediaWithInfo:(NSDictionary *)info {
      UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
      
      if (image == nil) {
         image = [info objectForKey:UIImagePickerControllerOriginalImage];
      }
   imageView.image = image;
}

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
   [self dismissModalViewControllerAnimated:YES];
}
@end

Đầu ra

Khi chúng tôi chạy ứng dụng và nhấp vào nút hiển thị máy ảnh, chúng tôi sẽ nhận được kết quả sau:

Quản lý máy ảnh ios

Khi chúng ta chụp ảnh, chúng ta có thể chỉnh sửa ảnh, tức là di chuyển và chia tỷ lệ như hình dưới đây

Quản lý máy ảnh ios

iOS – Xử lý vị trí

Chúng tôi có thể dễ dàng xác định vị trí hiện tại của người dùng trong iOS, miễn là người dùng cho phép ứng dụng truy cập thông tin với sự trợ giúp của khung vị trí cốt lõi.

Xử lý vị trí – Các bước đã thực hiện

Bước 1 – Tạo một ứng dụng dựa trên Chế độ xem đơn giản.

Bước 2 – Chọn tệp dự án của bạn, sau đó chọn mục tiêu và sau đó thêm CoreLocation.framework như hình dưới đây

iOS - Xử lý vị trí

Bước 3 – Thêm hai nhãn trong ViewController.xib và tạo ibOutlet đặt tên cho các nhãn tương ứng là latitudeLabel và longitudeLabel .

Bước 4 – Tạo một tệp mới bằng cách chọn Tệp → Mới → Tệp … → chọn lớp Objective C và nhấp vào tiếp theo.

Bước 5 – Đặt tên lớp là LocationHandler với “lớp con của” là NSObject.

Bước 6 – Chọn tạo.

Bước 7 – Cập nhật LocationHandler.h như sau:

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

@protocol LocationHandlerDelegate <NSObject>

@required
-(void) didUpdateToLocation:(CLLocation*)newLocation 
   fromLocation:(CLLocation*)oldLocation;
@end
@interface LocationHandler : NSObject<CLLocationManagerDelegate> {
   CLLocationManager *locationManager;
}
@property(nonatomic,strong) id<LocationHandlerDelegate> delegate;

+(id)getSharedInstance;
-(void)startUpdating;
-(void) stopUpdating;

@end

Bước 8 – Cập nhật LocationHandler.m như sau:

#import "LocationHandler.h"
static LocationHandler *DefaultManager = nil;

@interface LocationHandler()

-(void)initiate;

@end

@implementation LocationHandler

+(id)getSharedInstance{
   if (!DefaultManager) {
      DefaultManager = [[self allocWithZone:NULL]init];
      [DefaultManager initiate];
   }
   return DefaultManager;
}

-(void)initiate {
   locationManager = [[CLLocationManager alloc]init];
   locationManager.delegate = self;
}

-(void)startUpdating{
   [locationManager startUpdatingLocation];
}

-(void) stopUpdating {
   [locationManager stopUpdatingLocation];
}

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:
   (CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
   if ([self.delegate respondsToSelector:@selector
   (didUpdateToLocation:fromLocation:)]) {
      [self.delegate didUpdateToLocation:oldLocation 
      fromLocation:newLocation];
   }
}
@end

Bước 9 – Cập nhật ViewController.h như sau, nơi chúng tôi đã triển khai ủy quyền LocationHandler và tạo hai ibOutlet

#import <UIKit/UIKit.h>
#import "LocationHandler.h"

@interface ViewController : UIViewController<LocationHandlerDelegate> {
   IBOutlet UILabel *latitudeLabel;
   IBOutlet UILabel *longitudeLabel;
}
@end

Bước 10 – Cập nhật ViewController.m như sau:

#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
   [[LocationHandler getSharedInstance]setDelegate:self];
   [[LocationHandler getSharedInstance]startUpdating];
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

-(void)didUpdateToLocation:(CLLocation *)newLocation 
 fromLocation:(CLLocation *)oldLocation {
   [latitudeLabel setText:[NSString stringWithFormat:
   @"Latitude: %f",newLocation.coordinate.latitude]];
   [longitudeLabel setText:[NSString stringWithFormat:
   @"Longitude: %f",newLocation.coordinate.longitude]];
}
@end

Đầu ra

Khi chúng tôi chạy ứng dụng, chúng tôi sẽ nhận được kết quả sau:

iOS - Quản lý máy ảnh

iOS – Cơ sở dữ liệu SQLite

The post iOS – Quản lý máy ảnh appeared first on Dongthoigian.

]]>
https://dongthoigian.net/ios-quan-ly-may-anh/feed/ 0
iOS – Gia tốc kế https://dongthoigian.net/ios-gia-toc-ke/ https://dongthoigian.net/ios-gia-toc-ke/#respond Sun, 23 Jan 2022 10:50:47 +0000 https://dongthoigian.net/?p=10517 Gia tốc kế được sử dụng để phát hiện những thay đổi về vị trí của thiết bị theo ba hướng x, y và z

The post iOS – Gia tốc kế appeared first on Dongthoigian.

]]>
Gia tốc kế được sử dụng để phát hiện những thay đổi về vị trí của thiết bị theo ba hướng x, y và z. Chúng ta có thể biết vị trí hiện tại của thiết bị so với mặt đất. Để kiểm tra ví dụ này, bạn sẽ cần chạy nó trên một thiết bị và không hoạt động trên trình mô phỏng.

Gia tốc kế – Các bước liên quan

Bước 1 – Tạo một ứng dụng dựa trên Chế độ xem đơn giản .

Bước 2 – Thêm ba nhãn trong ViewController.xib và tạo ibOutlet đặt tên chúng là xlabel, ylabel và zlabel.

Bước 3 – Cập nhật ViewController.h như sau:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIAccelerometerDelegate> {
   IBOutlet UILabel *xlabel;
   IBOutlet UILabel *ylabel;
   IBOutlet UILabel *zlabel;
}
@end

Bước 4 – Cập nhật ViewController.m như sau:

#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
   [[UIAccelerometer sharedAccelerometer]setDelegate:self];
   //Do any additional setup after loading the view,typically from a nib
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:
   (UIAcceleration *)acceleration {
   [xlabel setText:[NSString stringWithFormat:@"%f",acceleration.x]];
   [ylabel setText:[NSString stringWithFormat:@"%f",acceleration.y]];
   [zlabel setText:[NSString stringWithFormat:@"%f",acceleration.z]];
}
@end

Đầu ra

Khi chúng tôi chạy ứng dụng trên thiết bị iPhone , chúng tôi sẽ nhận được kết quả sau:

iOS – Ứng dụng chung

Ứng dụng phổ quát là ứng dụng được thiết kế cho cả iPhone và iPad trong một tệp nhị phân duy nhất. Một ứng dụng phổ quát cho phép sử dụng lại mã và cập nhật nhanh chóng.

Ứng dụng phổ quát – Các bước liên quan

Bước 1 – Tạo một ứng dụng dựa trên Chế độ xem đơn giản .

Bước 2 – Thay đổi tên tệp tệp ViewController.xib thành tệp ViewController_iPhone.xib như được hiển thị bên dưới trong trình kiểm tra tệp ở phía bên tay phải.

iOS - Ứng dụng chung

Bước 3 – Chọn Tệp → Mới → Tệp … sau đó chọn tiểu mục “Giao diện người dùng” và chọn Xem . Bấm tiếp.

iOS - Ứng dụng chung

Bước 4 – Chọn họ thiết bị là iPad và nhấp vào tiếp theo.

iOS - Ứng dụng chung

Bước 5 – Lưu tệp dưới dạng ViewController_iPad.xib và chọn Tạo.

Bước 6 – Thêm nhãn ở giữa màn hình trong cả ViewController_iPhone.xib và ViewController_iPad.xib .

Bước 7 – Trong ViewController_iPad.xib , chọn trình kiểm tra danh tính và đặt lớp tùy chỉnh là ViewController .

Bước 8 – Cập nhật ứng dụng: phương thức DidFinishLaunching: withOptions trong AppDelegate.m như sau:

- (BOOL)application:(UIApplication *)application
   didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   self.window = [[UIWindow alloc] initWithFrame:[[UIScreen 
   mainScreen] bounds]];
   
   // Override point for customization after application launch.
   if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
      self.viewController = [[ViewController alloc] 
      initWithNibName:@"ViewController_iPhone" bundle:nil];
   } else {
      self.viewController = [[ViewController alloc] initWithNibName:
      @"ViewController_iPad" bundle:nil];
   }
   self.window.rootViewController = self.viewController;
   [self.window makeKeyAndVisible];
   return YES;
}

Bước 9 – Cập nhật các thiết bị trong bản tóm tắt dự án thành Universal như hình dưới đây

iOS - Gia tốc kế

Đầu ra

Khi chúng tôi chạy ứng dụng, chúng tôi sẽ nhận được kết quả sau:

iOS - Gia tốc kế

Khi chúng tôi chạy ứng dụng trong trình mô phỏng iPad, chúng tôi sẽ nhận được kết quả sau:

iOS - Gia tốc kế

iOS – Quản lý máy ảnh xem thêm

The post iOS – Gia tốc kế appeared first on Dongthoigian.

]]>
https://dongthoigian.net/ios-gia-toc-ke/feed/ 0